From d97f9831d5496e284965e7903365221b921aa605 Mon Sep 17 00:00:00 2001 From: janukobytsch Date: Mon, 2 Feb 2015 00:11:48 +0100 Subject: [PATCH 001/148] added flyweight pattern --- Structural/Flyweight/CharacterFlyweight.php | 36 +++++++++++++++++++ Structural/Flyweight/FlyweightFactory.php | 37 ++++++++++++++++++++ Structural/Flyweight/FlyweightInterface.php | 12 +++++++ Structural/Flyweight/Tests/FlyweightTest.php | 36 +++++++++++++++++++ 4 files changed, 121 insertions(+) create mode 100644 Structural/Flyweight/CharacterFlyweight.php create mode 100644 Structural/Flyweight/FlyweightFactory.php create mode 100644 Structural/Flyweight/FlyweightInterface.php create mode 100644 Structural/Flyweight/Tests/FlyweightTest.php diff --git a/Structural/Flyweight/CharacterFlyweight.php b/Structural/Flyweight/CharacterFlyweight.php new file mode 100644 index 0000000..77d6b2d --- /dev/null +++ b/Structural/Flyweight/CharacterFlyweight.php @@ -0,0 +1,36 @@ +name = $name; + } + + /** + * Clients supply the context-dependent information that the flyweight needs to draw itself + * For flyweights representing characters, extrinsic state usually contains e.g. the font + * @param string $font + */ + public function draw($font) + { + print_r("Character {$this->name} printed $font \n"); + } + +} \ No newline at end of file diff --git a/Structural/Flyweight/FlyweightFactory.php b/Structural/Flyweight/FlyweightFactory.php new file mode 100644 index 0000000..4558300 --- /dev/null +++ b/Structural/Flyweight/FlyweightFactory.php @@ -0,0 +1,37 @@ +pool)) { + $this->pool[(string) $name] = new CharacterFlyweight((string) $name); + } + return $this->pool[(string) $name]; + } + + public function totalNumber() + { + return sizeof($this->pool); + } + +} \ No newline at end of file diff --git a/Structural/Flyweight/FlyweightInterface.php b/Structural/Flyweight/FlyweightInterface.php new file mode 100644 index 0000000..cf43d57 --- /dev/null +++ b/Structural/Flyweight/FlyweightInterface.php @@ -0,0 +1,12 @@ +numberOfCharacters; $i++) { + $char = $this->characters[array_rand($this->characters)]; + $font = $this->fonts[array_rand($this->fonts)]; + $flyweight = $factory->$char; + // External state can be passed in like this: + // $flyweight->draw($font); + } + + // Flyweight pattern ensures that instances are shared + // instead of having hundreds of thousands of individual objects + $this->assertLessThanOrEqual($factory->totalNumber(), sizeof($this->characters)); + } +} From b2c034ec7f9a423d7a2f4521700b7fa4b7a0fd78 Mon Sep 17 00:00:00 2001 From: janukobytsch Date: Mon, 2 Feb 2015 15:36:32 +0100 Subject: [PATCH 002/148] fixed eol and typecast --- Structural/Flyweight/CharacterFlyweight.php | 51 ++++++++++---------- Structural/Flyweight/FlyweightFactory.php | 21 ++++---- Structural/Flyweight/FlyweightInterface.php | 9 ++-- Structural/Flyweight/Tests/FlyweightTest.php | 20 ++++---- 4 files changed, 49 insertions(+), 52 deletions(-) diff --git a/Structural/Flyweight/CharacterFlyweight.php b/Structural/Flyweight/CharacterFlyweight.php index 77d6b2d..43908c1 100644 --- a/Structural/Flyweight/CharacterFlyweight.php +++ b/Structural/Flyweight/CharacterFlyweight.php @@ -6,31 +6,30 @@ namespace DesignPatterns\Structural\Flyweight; * Implements the flyweight interface and adds storage for intrinsic state, if any. * Instances of concrete flyweights are shared by means of a factory. */ -class CharacterFlyweight implements FlyweightInterface { +class CharacterFlyweight implements FlyweightInterface +{ + /** + * Any state stored by the concrete flyweight must be independent of its context. + * For flyweights representing characters, this is usually the corresponding character code. + * @var string + */ + private $name; - /** - * Any state stored by the concrete flyweight must be independent of its context. - * For flyweights representing characters, this is usually the corresponding character code. - * @var string - */ - private $name; + /** + * Constructor. + * @param string $name + */ + public function __construct($name) { + $this->name = $name; + } - /** - * Constructor. - * @param string $name - */ - public function __construct($name) { - $this->name = $name; - } - - /** - * Clients supply the context-dependent information that the flyweight needs to draw itself - * For flyweights representing characters, extrinsic state usually contains e.g. the font - * @param string $font - */ - public function draw($font) - { - print_r("Character {$this->name} printed $font \n"); - } - -} \ No newline at end of file + /** + * Clients supply the context-dependent information that the flyweight needs to draw itself + * For flyweights representing characters, extrinsic state usually contains e.g. the font + * @param string $font + */ + public function draw($font) + { + print_r("Character {$this->name} printed $font \n"); + } +} diff --git a/Structural/Flyweight/FlyweightFactory.php b/Structural/Flyweight/FlyweightFactory.php index 4558300..5b17a43 100644 --- a/Structural/Flyweight/FlyweightFactory.php +++ b/Structural/Flyweight/FlyweightFactory.php @@ -8,30 +8,29 @@ use DesignPatterns\Structural\Flyweight\CharacterFlyweight; * A factory manages shared flyweights. Clients shouldn't instaniate them directly, * but let the factory take care of returning existing objects or creating new ones. */ -class FlyweightFactory { - - /** - * Associative store for flyweight objects +class FlyweightFactory +{ + /** + * Associative store for flyweight objects * @var Array */ - private $pool = array(); + private $pool = array(); - /** + /** * Magic getter * @param string $name * @return Flyweight */ public function __get($name) { - if (!array_key_exists((string) $name, $this->pool)) { - $this->pool[(string) $name] = new CharacterFlyweight((string) $name); + if (!array_key_exists($name, $this->pool)) { + $this->pool[$name] = new CharacterFlyweight($name); } - return $this->pool[(string) $name]; + return $this->pool[$name]; } public function totalNumber() { return sizeof($this->pool); } - -} \ No newline at end of file +} diff --git a/Structural/Flyweight/FlyweightInterface.php b/Structural/Flyweight/FlyweightInterface.php index cf43d57..e48bb8f 100644 --- a/Structural/Flyweight/FlyweightInterface.php +++ b/Structural/Flyweight/FlyweightInterface.php @@ -5,8 +5,7 @@ namespace DesignPatterns\Structural\Flyweight; /** * An interface through which flyweights can receive and act on extrinsic state */ -interface FlyweightInterface { - - public function draw($extrinsicState); - -} \ No newline at end of file +interface FlyweightInterface +{ + public function draw($extrinsicState); +} diff --git a/Structural/Flyweight/Tests/FlyweightTest.php b/Structural/Flyweight/Tests/FlyweightTest.php index ade3fde..90c3f3a 100644 --- a/Structural/Flyweight/Tests/FlyweightTest.php +++ b/Structural/Flyweight/Tests/FlyweightTest.php @@ -10,23 +10,23 @@ use DesignPatterns\Structural\Flyweight\FlyweightFactory; */ class FlyweightTest extends \PHPUnit_Framework_TestCase { - private $characters = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', - 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'); - private $fonts = array('Arial', 'Times New Roman', 'Verdana', 'Helvetica'); + private $characters = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', + 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'); + private $fonts = array('Arial', 'Times New Roman', 'Verdana', 'Helvetica'); - // This is about the number of characters in a book of average length - private $numberOfCharacters = 300000; + // This is about the number of characters in a book of average length + private $numberOfCharacters = 300000; public function testFlyweight() { $factory = new FlyweightFactory(); for ($i = 0; $i < $this->numberOfCharacters; $i++) { - $char = $this->characters[array_rand($this->characters)]; - $font = $this->fonts[array_rand($this->fonts)]; - $flyweight = $factory->$char; - // External state can be passed in like this: - // $flyweight->draw($font); + $char = $this->characters[array_rand($this->characters)]; + $font = $this->fonts[array_rand($this->fonts)]; + $flyweight = $factory->$char; + // External state can be passed in like this: + // $flyweight->draw($font); } // Flyweight pattern ensures that instances are shared From 1120fab17dbc5573f12cb259768a9aa2d7ab0a1e Mon Sep 17 00:00:00 2001 From: Alex Nastase Date: Mon, 7 Mar 2016 21:37:33 +0200 Subject: [PATCH 003/148] Comment updates in AbstractFactory Fixed minor typos and punctuation in comments. --- Creational/AbstractFactory/AbstractFactory.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Creational/AbstractFactory/AbstractFactory.php b/Creational/AbstractFactory/AbstractFactory.php index 6529ff6..fd69448 100644 --- a/Creational/AbstractFactory/AbstractFactory.php +++ b/Creational/AbstractFactory/AbstractFactory.php @@ -11,11 +11,11 @@ namespace DesignPatterns\Creational\AbstractFactory; * it is the concrete subclass which creates concrete components. * * In this case, the abstract factory is a contract for creating some components - * for the web. There are two components : Text and Picture. There is two ways + * for the web. There are two components : Text and Picture. There are two ways * of rendering : HTML or JSON. * - * Therefore 4 concretes classes, but the client just need to know this contract - * to build a correct http response (for a html page or for an ajax request) + * Therefore 4 concrete classes, but the client just needs to know this contract + * to build a correct HTTP response (for a HTML page or for an AJAX request). */ abstract class AbstractFactory { From 0e358b79d262eaf53cdcab64526e38456e62a319 Mon Sep 17 00:00:00 2001 From: Petr Jurasek Date: Mon, 21 Mar 2016 17:03:04 +0100 Subject: [PATCH 004/148] Typo Typo update --- Structural/Facade/BiosInterface.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Structural/Facade/BiosInterface.php b/Structural/Facade/BiosInterface.php index 823af04..2655e6f 100644 --- a/Structural/Facade/BiosInterface.php +++ b/Structural/Facade/BiosInterface.php @@ -3,29 +3,29 @@ namespace DesignPatterns\Structural\Facade; /** - * Class BiosInterface. + * Interface BiosInterface */ interface BiosInterface { /** - * execute the BIOS. + * execute the BIOS */ public function execute(); /** - * wait for halt. + * wait for halt */ public function waitForKeyPress(); /** - * launches the OS. + * launches the OS * * @param OsInterface $os */ public function launch(OsInterface $os); /** - * power down BIOS. + * power down BIOS */ public function powerDown(); } From 00c3903b2e88143357070665edaaa3cc11121025 Mon Sep 17 00:00:00 2001 From: Petr Jurasek Date: Thu, 24 Mar 2016 09:45:55 +0100 Subject: [PATCH 005/148] Capitalize letters and add dots --- Structural/Facade/BiosInterface.php | 10 +++++----- Structural/Facade/Facade.php | 6 +++--- Structural/Facade/OsInterface.php | 4 ++-- Structural/Facade/Tests/FacadeTest.php | 2 ++ 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Structural/Facade/BiosInterface.php b/Structural/Facade/BiosInterface.php index 2655e6f..8f1aa01 100644 --- a/Structural/Facade/BiosInterface.php +++ b/Structural/Facade/BiosInterface.php @@ -3,29 +3,29 @@ namespace DesignPatterns\Structural\Facade; /** - * Interface BiosInterface + * Interface BiosInterface. */ interface BiosInterface { /** - * execute the BIOS + * Execute the BIOS. */ public function execute(); /** - * wait for halt + * Wait for halt. */ public function waitForKeyPress(); /** - * launches the OS + * Launches the OS. * * @param OsInterface $os */ public function launch(OsInterface $os); /** - * power down BIOS + * Power down BIOS. */ public function powerDown(); } diff --git a/Structural/Facade/Facade.php b/Structural/Facade/Facade.php index 50c665d..6c96fea 100644 --- a/Structural/Facade/Facade.php +++ b/Structural/Facade/Facade.php @@ -3,7 +3,7 @@ namespace DesignPatterns\Structural\Facade; /** - * + * Class Facade */ class Facade { @@ -31,7 +31,7 @@ class Facade } /** - * turn on the system. + * Turn on the system. */ public function turnOn() { @@ -41,7 +41,7 @@ class Facade } /** - * turn off the system. + * Turn off the system. */ public function turnOff() { diff --git a/Structural/Facade/OsInterface.php b/Structural/Facade/OsInterface.php index 8394fd4..d8171e4 100644 --- a/Structural/Facade/OsInterface.php +++ b/Structural/Facade/OsInterface.php @@ -3,12 +3,12 @@ namespace DesignPatterns\Structural\Facade; /** - * Class OsInterface. + * Interface OsInterface. */ interface OsInterface { /** - * halt the OS. + * Halt the OS. */ public function halt(); } diff --git a/Structural/Facade/Tests/FacadeTest.php b/Structural/Facade/Tests/FacadeTest.php index e6038a0..0f1ea10 100644 --- a/Structural/Facade/Tests/FacadeTest.php +++ b/Structural/Facade/Tests/FacadeTest.php @@ -34,6 +34,8 @@ class FacadeTest extends \PHPUnit_Framework_TestCase } /** + * @param Computer $facade + * @param OsInterface $os * @dataProvider getComputer */ public function testComputerOn(Computer $facade, OsInterface $os) From 730316c11b2775c4c7f566b0431b9737bde4e32c Mon Sep 17 00:00:00 2001 From: Petr Jurasek Date: Thu, 24 Mar 2016 10:07:07 +0100 Subject: [PATCH 006/148] Add an dot --- Structural/Facade/Facade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Structural/Facade/Facade.php b/Structural/Facade/Facade.php index 6c96fea..43d1bcb 100644 --- a/Structural/Facade/Facade.php +++ b/Structural/Facade/Facade.php @@ -3,7 +3,7 @@ namespace DesignPatterns\Structural\Facade; /** - * Class Facade + * Class Facade. */ class Facade { From 0451b86d6ca0870a670563a798573f063963cb19 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Mon, 28 Mar 2016 20:01:41 +0200 Subject: [PATCH 007/148] German translation --- .../ChainOfResponsibilities/README.po | 96 +++++++++++++++ .../LC_MESSAGES/Behavioral/Command/README.po | 110 ++++++++++++++++++ locale/de/LC_MESSAGES/README.po | 103 ++++++++++++++++ 3 files changed, 309 insertions(+) create mode 100644 locale/de/LC_MESSAGES/Behavioral/ChainOfResponsibilities/README.po create mode 100644 locale/de/LC_MESSAGES/Behavioral/Command/README.po create mode 100644 locale/de/LC_MESSAGES/README.po diff --git a/locale/de/LC_MESSAGES/Behavioral/ChainOfResponsibilities/README.po b/locale/de/LC_MESSAGES/Behavioral/ChainOfResponsibilities/README.po new file mode 100644 index 0000000..dc8955d --- /dev/null +++ b/locale/de/LC_MESSAGES/Behavioral/ChainOfResponsibilities/README.po @@ -0,0 +1,96 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2016-03-28 19:48+0200\n" +"Last-Translator: Eugene Glotov \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7\n" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:2 +msgid "`Chain Of Responsibilities`__" +msgstr "`Chain Of Responsibilities`__" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:5 +msgid "Purpose:" +msgstr "Zweck:" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:7 +msgid "" +"To build a chain of objects to handle a call in sequential order. If one object cannot handle a call, it delegates " +"the call to the next in the chain and so forth." +msgstr "" +"Um eine Kette von Objekten zu bauen, die einen Aufruf in sequentieller Folge abzuarbeiten. Wenn ein Objekt den " +"Aufruf nicht bearbeiten kann, delegiert es die Anfrage weiter an das nächste Objekt und so weiter. So lange, bis " +"die Anfrage von einem Objekt erfolgreich abgearbeitet werden kann." + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:12 +msgid "Examples:" +msgstr "Beispiele:" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:14 +msgid "logging framework, where each chain element decides autonomously what to do with a log message" +msgstr "" +"Logging Framework, in dem jedes Element der Kette automatisch entscheidet, was es mit einer Logmessage tun möchte" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:16 +msgid "a Spam filter" +msgstr "ein Spamfilter" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:17 +msgid "" +"Caching: first object is an instance of e.g. a Memcached Interface, if that \"misses\" it delegates the call to " +"the database interface" +msgstr "" +"Caching: das erste Objekt ist Beispielsweise eine Memcache-Instanz. Wenn es einen „Miss“ hat, dann wird an das " +"nächste Element weitergeleitet, das eine Datenbank-Abfrage unternimmt" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:19 +msgid "" +"Yii Framework: CFilterChain is a chain of controller action filters. the executing point is passed from one filter " +"to the next along the chain, and only if all filters say \"yes\", the action can be invoked at last." +msgstr "" +"Yii Framework: CFilterChain ist eine Kette von Controller Action Filters. In der Ausführung wird in der Kette " +"immer weitergereicht und nur wenn alle Filter „ja“ sagen, wird die Aktion am Ende ausgeführt." + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:25 +msgid "UML Diagram" +msgstr "UML Diagramm" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:32 +msgid "Code" +msgstr "Code" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:34 +msgid "You can also find these code on `GitHub`_" +msgstr "Du kannst den Code auch auf `GitHub` einsehen_" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:36 +msgid "Request.php" +msgstr "Request.php" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:42 +msgid "Handler.php" +msgstr "Handler.php" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:48 +msgid "Responsible/SlowStorage.php" +msgstr "Responsible/SlowStorage.php" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:54 +msgid "Responsible/FastStorage.php" +msgstr "Responsible/FastStorage.php" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:61 +msgid "Test" +msgstr "Теst" + +#: ../../Behavioral/ChainOfResponsibilities/README.rst:63 +msgid "Tests/ChainTest.php" +msgstr "Tests/ChainTest.php" diff --git a/locale/de/LC_MESSAGES/Behavioral/Command/README.po b/locale/de/LC_MESSAGES/Behavioral/Command/README.po new file mode 100644 index 0000000..dd94100 --- /dev/null +++ b/locale/de/LC_MESSAGES/Behavioral/Command/README.po @@ -0,0 +1,110 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2016-03-28 19:56+0200\n" +"Last-Translator: Eugene Glotov \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7\n" + +#: ../../Behavioral/Command/README.rst:2 +msgid "`Command`__" +msgstr "`Command`__" + +#: ../../Behavioral/Command/README.rst:5 +msgid "Purpose" +msgstr "Zweck" + +#: ../../Behavioral/Command/README.rst:7 +msgid "To encapsulate invocation and decoupling." +msgstr "Um Ausführung zu kapseln und Entkopplung zu erreichen." + +#: ../../Behavioral/Command/README.rst:9 +msgid "" +"We have an Invoker and a Receiver. This pattern uses a \"Command\" to delegate the method call " +"against the Receiver and presents the same method \"execute\". Therefore, the Invoker just " +"knows to call \"execute\" to process the Command of the client. The Receiver is decoupled from " +"the Invoker." +msgstr "" +"Wir haben einen Invoker (Ausführer) und einen Receiver (Empfänger). Dieses Pattern benutzt ein " +"„Command“ um die Ausführung einer Methode and einen Empfänger zu delegieren und eine " +"einheitliche „execute“ Methode bereitzustellen. Damit weiß der Ausführer nur von der „execute“-" +"Methode, um den Befehl auszuführen. Der Empfänger wird dadurch vom Aufrufer entkoppelt." + +#: ../../Behavioral/Command/README.rst:15 +msgid "" +"The second aspect of this pattern is the undo(), which undoes the method execute(). Command " +"can also be aggregated to combine more complex commands with minimum copy-paste and relying on " +"composition over inheritance." +msgstr "" +"Der zweite Aspekt dieses Musters ist die `undo()` Methode, die die Ausführung der `execute()` " +"Methode rückgängig machen kann. Befehlen können außerdem aggregiert werden, um komplexe " +"Befehle mit minimalem Aufwand und mit Komposition (anstatt Vererbung) zu erstellen." + +#: ../../Behavioral/Command/README.rst:21 +msgid "Examples" +msgstr "Beispiele" + +#: ../../Behavioral/Command/README.rst:23 +msgid "A text editor : all events are Command which can be undone, stacked and saved." +msgstr "" +"Ein Texteditor: alle Ereignisse sind Befehle, die rückgängig gemacht, gestapelt und " +"gespeichert werden können." + +#: ../../Behavioral/Command/README.rst:25 +msgid "" +"Symfony2: SF2 Commands that can be run from the CLI are built with just the Command pattern in " +"mind" +msgstr "" +"Symfony2: Commands die auf der Konsole ausgeführt werden können, werden als Command Muster " +"entwickelt." + +#: ../../Behavioral/Command/README.rst:27 +msgid "" +"big CLI tools use subcommands to distribute various tasks and pack them in \"modules\", each " +"of these can be implemented with the Command pattern (e.g. vagrant)" +msgstr "" +"Komplexe Konsolentools bestehen aus Subcommands, um die Aufgaben besser zu modulariseren. " +"Jedes dieser Commands kann als Command-Pattern implementiert werden (z.B. vagrant)." + +#: ../../Behavioral/Command/README.rst:32 +msgid "UML Diagram" +msgstr "UML Diagramm" + +#: ../../Behavioral/Command/README.rst:39 +msgid "Code" +msgstr "Code" + +#: ../../Behavioral/Command/README.rst:41 +msgid "You can also find these code on `GitHub`_" +msgstr "Du kannst diesen Code auch auf `GitHub` einsehen_" + +#: ../../Behavioral/Command/README.rst:43 +msgid "CommandInterface.php" +msgstr "CommandInterface.php" + +#: ../../Behavioral/Command/README.rst:49 +msgid "HelloCommand.php" +msgstr "HelloCommand.php" + +#: ../../Behavioral/Command/README.rst:55 +msgid "Receiver.php" +msgstr "Receiver.php" + +#: ../../Behavioral/Command/README.rst:61 +msgid "Invoker.php" +msgstr "Invoker.php" + +#: ../../Behavioral/Command/README.rst:68 +msgid "Test" +msgstr "Теst" + +#: ../../Behavioral/Command/README.rst:70 +msgid "Tests/CommandTest.php" +msgstr "Tests/CommandTest.php" diff --git a/locale/de/LC_MESSAGES/README.po b/locale/de/LC_MESSAGES/README.po new file mode 100644 index 0000000..c33d9b8 --- /dev/null +++ b/locale/de/LC_MESSAGES/README.po @@ -0,0 +1,103 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2016-03-28 19:42+0200\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7\n" + +#: ../../README.rst:5 +msgid "DesignPatternsPHP" +msgstr "DesignPatternsPHP" + +#: ../../README.rst:11 +msgid "" +"This is a collection of known `design patterns`_ and some sample code how to implement them in PHP. Every pattern has a " +"small list of examples (most of them from Zend Framework, Symfony2 or Doctrine2 as I'm most familiar with this software)." +msgstr "" +"Das ist eine Sammlung bekannter Entwurfsmuster (sog. Design Patterns) und Beispielcode, wie man diese in PHP implementieren " +"kann. Für jedes Muster gibt es Beispiele (die meisten davon aus dem Zend Framework, Symfony2 oder Doctrine2, da diese " +"Frameworks weit verbreitet und bekannt sind)." + +#: ../../README.rst:16 +msgid "I think the problem with patterns is that often people do know them but don't know when to apply which." +msgstr "" +"Ich denke das Problem mit den Mustern ist, dass sie eigentlich sehr bekannt und gut dokumentiert sind, allerdings viele " +"nicht wissen, wann und wie man sie einsetzt." + +#: ../../README.rst:20 +msgid "Patterns" +msgstr "Muster" + +#: ../../README.rst:22 +msgid "" +"The patterns can be structured in roughly three different categories. Please click on **the title of every pattern's page** " +"for a full explanation of the pattern on Wikipedia." +msgstr "" +"Die Patterns können grob in drei Kategorien eingeteilt werden. Um eine vollständige Beschreibung der Muster lesen zu können, " +"klicke bitte auf **die Titelseite des jeweiligen Entwurfsmusters**." + +#: ../../README.rst:35 +msgid "Contribute" +msgstr "Beitragen" + +#: ../../README.rst:37 +msgid "" +"Please feel free to fork and extend existing or add your own examples and send a pull request with your changes! To " +"establish a consistent code quality, please check your code using `PHP CodeSniffer`_ against `PSR2 standard`_ using ``./" +"vendor/bin/phpcs -p --standard=PSR2 --ignore=vendor .``." +msgstr "" +"Um die Beispiele zu erweitern oder neue Patterns zu ergänzen kannst du gerne das Projekt forken und bearbeiten! Um eine gute " +"Codequalität zu gewährleisten, benutze bitte `PHP CodeSniffer` mit dem `PSR2 Standard`: `./vendor/bin/phpcs -p --" +"standard=PSR2 --ignore=vendor .`." + +#: ../../README.rst:44 +msgid "License" +msgstr "Lizenz" + +#: ../../README.rst:46 +msgid "(The MIT License)" +msgstr "(The MIT License)" + +#: ../../README.rst:48 +msgid "Copyright (c) 2014 `Dominik Liebler`_ and `contributors`_" +msgstr "Copyright (c) 2014 `Dominik Liebler`_ and `contributors`_" + +#: ../../README.rst:50 +msgid "" +"Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation " +"files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, " +"modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the " +"Software is furnished to do so, subject to the following conditions:" +msgstr "" +"Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation " +"files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, " +"modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the " +"Software is furnished to do so, subject to the following conditions:" + +#: ../../README.rst:58 +msgid "" +"The above copyright notice and this permission notice shall be included in all copies or substantial portions of the " +"Software." +msgstr "" +"The above copyright notice and this permission notice shall be included in all copies or substantial portions of the " +"Software." + +#: ../../README.rst:61 +msgid "" +"THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE " +"WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR " +"COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, " +"ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." +msgstr "" +"THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE " +"WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR " +"COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, " +"ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." From a6c69b836fb2c26bf7917fa7c6b49a563f7753c1 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Mon, 28 Mar 2016 20:56:09 +0200 Subject: [PATCH 008/148] set language to de --- .../LC_MESSAGES/Behavioral/ChainOfResponsibilities/README.po | 2 +- locale/de/LC_MESSAGES/Behavioral/Command/README.po | 2 +- locale/de/LC_MESSAGES/README.po | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/de/LC_MESSAGES/Behavioral/ChainOfResponsibilities/README.po b/locale/de/LC_MESSAGES/Behavioral/ChainOfResponsibilities/README.po index dc8955d..977b7d3 100644 --- a/locale/de/LC_MESSAGES/Behavioral/ChainOfResponsibilities/README.po +++ b/locale/de/LC_MESSAGES/Behavioral/ChainOfResponsibilities/README.po @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" +"Language: de\n" "Language-Team: \n" "X-Generator: Poedit 1.8.7\n" diff --git a/locale/de/LC_MESSAGES/Behavioral/Command/README.po b/locale/de/LC_MESSAGES/Behavioral/Command/README.po index dd94100..9285749 100644 --- a/locale/de/LC_MESSAGES/Behavioral/Command/README.po +++ b/locale/de/LC_MESSAGES/Behavioral/Command/README.po @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" +"Language: de\n" "Language-Team: \n" "X-Generator: Poedit 1.8.7\n" diff --git a/locale/de/LC_MESSAGES/README.po b/locale/de/LC_MESSAGES/README.po index c33d9b8..3eb7c9c 100644 --- a/locale/de/LC_MESSAGES/README.po +++ b/locale/de/LC_MESSAGES/README.po @@ -4,12 +4,12 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2016-03-28 19:42+0200\n" +"PO-Revision-Date: 2016-03-28 20:54+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" +"Language: de\n" "Language-Team: \n" "X-Generator: Poedit 1.8.7\n" From 4200d5a8741d37ba4817ae72d39980e9258d6237 Mon Sep 17 00:00:00 2001 From: Filis Date: Tue, 29 Mar 2016 18:38:17 +0200 Subject: [PATCH 009/148] copyright year? --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 440185f..06cf4ea 100755 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ To establish a consistent code quality, please check your code using [PHP_CodeSn (The MIT License) -Copyright (c) 2014 Dominik Liebler and [contributors](https://github.com/domnikl/DesignPatternsPHP/graphs/contributors) +Copyright (c) 2016 Dominik Liebler and [contributors](https://github.com/domnikl/DesignPatternsPHP/graphs/contributors) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From 32e0c656cd6d347e3140927841f8628f207ecc09 Mon Sep 17 00:00:00 2001 From: Filis Date: Wed, 30 Mar 2016 00:13:50 +0200 Subject: [PATCH 010/148] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 06cf4ea..37d79a6 100755 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ To establish a consistent code quality, please check your code using [PHP_CodeSn (The MIT License) -Copyright (c) 2016 Dominik Liebler and [contributors](https://github.com/domnikl/DesignPatternsPHP/graphs/contributors) +Copyright (c) 2014 - 2016 Dominik Liebler and [contributors](https://github.com/domnikl/DesignPatternsPHP/graphs/contributors) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From babb71702faa39168c876d5a9a7e754d571c2310 Mon Sep 17 00:00:00 2001 From: Filis Date: Wed, 30 Mar 2016 13:47:19 +0200 Subject: [PATCH 011/148] updated copyright year 2011 - 2016 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 37d79a6..a378e35 100755 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ To establish a consistent code quality, please check your code using [PHP_CodeSn (The MIT License) -Copyright (c) 2014 - 2016 Dominik Liebler and [contributors](https://github.com/domnikl/DesignPatternsPHP/graphs/contributors) +Copyright (c) 2011 - 2016 Dominik Liebler and [contributors](https://github.com/domnikl/DesignPatternsPHP/graphs/contributors) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From 8887a564c23afbe2b48d7160b21cf36e8c2bc72a Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Sun, 3 Apr 2016 14:44:28 +0200 Subject: [PATCH 012/148] translated all behavioral patterns --- .../ChainOfResponsibilities/README.po | 2 +- .../LC_MESSAGES/Behavioral/Command/README.po | 2 +- .../LC_MESSAGES/Behavioral/Iterator/README.po | 83 +++++++++++ .../LC_MESSAGES/Behavioral/Mediator/README.po | 85 ++++++++++++ .../LC_MESSAGES/Behavioral/Memento/README.po | 100 ++++++++++++++ .../Behavioral/NullObject/README.po | 109 +++++++++++++++ .../LC_MESSAGES/Behavioral/Observer/README.po | 81 +++++++++++ locale/de/LC_MESSAGES/Behavioral/README.po | 26 ++++ .../Behavioral/Specification/README.po | 88 ++++++++++++ .../de/LC_MESSAGES/Behavioral/State/README.po | 68 +++++++++ .../LC_MESSAGES/Behavioral/Strategy/README.po | 98 +++++++++++++ .../Behavioral/TemplateMethod/README.po | 86 ++++++++++++ .../LC_MESSAGES/Behavioral/Visitor/README.po | 80 +++++++++++ .../Creational/AbstractFactory/README.po | 95 +++++++++++++ .../LC_MESSAGES/Creational/Builder/README.po | 118 ++++++++++++++++ .../Creational/FactoryMethod/README.po | 101 ++++++++++++++ .../LC_MESSAGES/Creational/Multiton/README.po | 72 ++++++++++ .../de/LC_MESSAGES/Creational/Pool/README.po | 98 +++++++++++++ .../Creational/Prototype/README.po | 74 ++++++++++ locale/de/LC_MESSAGES/Creational/README.po | 31 +++++ .../Creational/SimpleFactory/README.po | 77 +++++++++++ .../Creational/Singleton/README.po | 87 ++++++++++++ .../Creational/StaticFactory/README.po | 82 +++++++++++ .../de/LC_MESSAGES/More/Delegation/README.po | 60 ++++++++ locale/de/LC_MESSAGES/More/README.po | 16 +++ .../de/LC_MESSAGES/More/Repository/README.po | 85 ++++++++++++ .../LC_MESSAGES/More/ServiceLocator/README.po | 107 ++++++++++++++ .../LC_MESSAGES/Structural/Adapter/README.po | 92 +++++++++++++ .../LC_MESSAGES/Structural/Bridge/README.po | 83 +++++++++++ .../Structural/Composite/README.po | 87 ++++++++++++ .../Structural/DataMapper/README.po | 94 +++++++++++++ .../Structural/Decorator/README.po | 82 +++++++++++ .../Structural/DependencyInjection/README.po | 130 ++++++++++++++++++ .../LC_MESSAGES/Structural/Facade/README.po | 106 ++++++++++++++ .../Structural/FluentInterface/README.po | 72 ++++++++++ .../de/LC_MESSAGES/Structural/Proxy/README.po | 66 +++++++++ locale/de/LC_MESSAGES/Structural/README.po | 28 ++++ .../LC_MESSAGES/Structural/Registry/README.po | 74 ++++++++++ 38 files changed, 2923 insertions(+), 2 deletions(-) create mode 100644 locale/de/LC_MESSAGES/Behavioral/Iterator/README.po create mode 100644 locale/de/LC_MESSAGES/Behavioral/Mediator/README.po create mode 100644 locale/de/LC_MESSAGES/Behavioral/Memento/README.po create mode 100644 locale/de/LC_MESSAGES/Behavioral/NullObject/README.po create mode 100644 locale/de/LC_MESSAGES/Behavioral/Observer/README.po create mode 100644 locale/de/LC_MESSAGES/Behavioral/README.po create mode 100644 locale/de/LC_MESSAGES/Behavioral/Specification/README.po create mode 100644 locale/de/LC_MESSAGES/Behavioral/State/README.po create mode 100644 locale/de/LC_MESSAGES/Behavioral/Strategy/README.po create mode 100644 locale/de/LC_MESSAGES/Behavioral/TemplateMethod/README.po create mode 100644 locale/de/LC_MESSAGES/Behavioral/Visitor/README.po create mode 100644 locale/de/LC_MESSAGES/Creational/AbstractFactory/README.po create mode 100644 locale/de/LC_MESSAGES/Creational/Builder/README.po create mode 100644 locale/de/LC_MESSAGES/Creational/FactoryMethod/README.po create mode 100644 locale/de/LC_MESSAGES/Creational/Multiton/README.po create mode 100644 locale/de/LC_MESSAGES/Creational/Pool/README.po create mode 100644 locale/de/LC_MESSAGES/Creational/Prototype/README.po create mode 100644 locale/de/LC_MESSAGES/Creational/README.po create mode 100644 locale/de/LC_MESSAGES/Creational/SimpleFactory/README.po create mode 100644 locale/de/LC_MESSAGES/Creational/Singleton/README.po create mode 100644 locale/de/LC_MESSAGES/Creational/StaticFactory/README.po create mode 100644 locale/de/LC_MESSAGES/More/Delegation/README.po create mode 100644 locale/de/LC_MESSAGES/More/README.po create mode 100644 locale/de/LC_MESSAGES/More/Repository/README.po create mode 100644 locale/de/LC_MESSAGES/More/ServiceLocator/README.po create mode 100644 locale/de/LC_MESSAGES/Structural/Adapter/README.po create mode 100644 locale/de/LC_MESSAGES/Structural/Bridge/README.po create mode 100644 locale/de/LC_MESSAGES/Structural/Composite/README.po create mode 100644 locale/de/LC_MESSAGES/Structural/DataMapper/README.po create mode 100644 locale/de/LC_MESSAGES/Structural/Decorator/README.po create mode 100644 locale/de/LC_MESSAGES/Structural/DependencyInjection/README.po create mode 100644 locale/de/LC_MESSAGES/Structural/Facade/README.po create mode 100644 locale/de/LC_MESSAGES/Structural/FluentInterface/README.po create mode 100644 locale/de/LC_MESSAGES/Structural/Proxy/README.po create mode 100644 locale/de/LC_MESSAGES/Structural/README.po create mode 100644 locale/de/LC_MESSAGES/Structural/Registry/README.po diff --git a/locale/de/LC_MESSAGES/Behavioral/ChainOfResponsibilities/README.po b/locale/de/LC_MESSAGES/Behavioral/ChainOfResponsibilities/README.po index 977b7d3..d9fc255 100644 --- a/locale/de/LC_MESSAGES/Behavioral/ChainOfResponsibilities/README.po +++ b/locale/de/LC_MESSAGES/Behavioral/ChainOfResponsibilities/README.po @@ -5,7 +5,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" "PO-Revision-Date: 2016-03-28 19:48+0200\n" -"Last-Translator: Eugene Glotov \n" +"Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/locale/de/LC_MESSAGES/Behavioral/Command/README.po b/locale/de/LC_MESSAGES/Behavioral/Command/README.po index 9285749..a09f2df 100644 --- a/locale/de/LC_MESSAGES/Behavioral/Command/README.po +++ b/locale/de/LC_MESSAGES/Behavioral/Command/README.po @@ -5,7 +5,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" "PO-Revision-Date: 2016-03-28 19:56+0200\n" -"Last-Translator: Eugene Glotov \n" +"Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/locale/de/LC_MESSAGES/Behavioral/Iterator/README.po b/locale/de/LC_MESSAGES/Behavioral/Iterator/README.po new file mode 100644 index 0000000..56e4f7f --- /dev/null +++ b/locale/de/LC_MESSAGES/Behavioral/Iterator/README.po @@ -0,0 +1,83 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2016-03-29 05:44+0200\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7\n" + +#: ../../Behavioral/Iterator/README.rst:2 +msgid "`Iterator`__" +msgstr "`Итератор `_ (`Iterator`__)" + +#: ../../Behavioral/Iterator/README.rst:5 +msgid "Purpose" +msgstr "Zweck" + +#: ../../Behavioral/Iterator/README.rst:7 +msgid "To make an object iterable and to make it appear like a collection of objects." +msgstr "" + +#: ../../Behavioral/Iterator/README.rst:11 +msgid "Examples" +msgstr "Beispiele" + +#: ../../Behavioral/Iterator/README.rst:13 +msgid "" +"to process a file line by line by just running over all lines (which have an object " +"representation) for a file (which of course is an object, too)" +msgstr "" + +#: ../../Behavioral/Iterator/README.rst:18 +msgid "Note" +msgstr "Hinweis" + +#: ../../Behavioral/Iterator/README.rst:20 +msgid "" +"Standard PHP Library (SPL) defines an interface Iterator which is best suited for this! Often you " +"would want to implement the Countable interface too, to allow ``count($object)`` on your iterable " +"object" +msgstr "" + +#: ../../Behavioral/Iterator/README.rst:25 +msgid "UML Diagram" +msgstr "UML Diagramm" + +#: ../../Behavioral/Iterator/README.rst:32 +msgid "Code" +msgstr "Code" + +#: ../../Behavioral/Iterator/README.rst:34 +msgid "You can also find these code on `GitHub`_" +msgstr "Du kannst den Code auch auf `GitHub` einsehen_" + +#: ../../Behavioral/Iterator/README.rst:36 +msgid "Book.php" +msgstr "Book.php" + +#: ../../Behavioral/Iterator/README.rst:42 +msgid "BookList.php" +msgstr "BookList.php" + +#: ../../Behavioral/Iterator/README.rst:48 +msgid "BookListIterator.php" +msgstr "BookListIterator.php" + +#: ../../Behavioral/Iterator/README.rst:54 +msgid "BookListReverseIterator.php" +msgstr "BookListReverseIterator.php" + +#: ../../Behavioral/Iterator/README.rst:61 +msgid "Test" +msgstr "Теst" + +#: ../../Behavioral/Iterator/README.rst:63 +msgid "Tests/IteratorTest.php" +msgstr "Tests/IteratorTest.php" diff --git a/locale/de/LC_MESSAGES/Behavioral/Mediator/README.po b/locale/de/LC_MESSAGES/Behavioral/Mediator/README.po new file mode 100644 index 0000000..7735326 --- /dev/null +++ b/locale/de/LC_MESSAGES/Behavioral/Mediator/README.po @@ -0,0 +1,85 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2016-04-03 12:46+0200\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7\n" + +#: ../../Behavioral/Mediator/README.rst:2 +msgid "`Mediator`__" +msgstr "`Mediator`__" + +#: ../../Behavioral/Mediator/README.rst:5 +msgid "Purpose" +msgstr "Zweck" + +#: ../../Behavioral/Mediator/README.rst:7 +msgid "" +"This pattern provides an easy to decouple many components working together. It is a good " +"alternative over Observer IF you have a \"central intelligence\", like a controller (but not in the " +"sense of the MVC)." +msgstr "" +"Dieses Muster bietet eine einfache Möglichkeit, viele, miteinander arbeitende Komponenten zu " +"entkoppeln. Es ist eine gute Alternative für das Observer-Pattern, wenn du eine „zentrale " +"Intelligenz“ wie z.B. einen Controller (nicht im MVC-Sinne) in deiner Architektur hast." + +#: ../../Behavioral/Mediator/README.rst:11 +msgid "" +"All components (called Colleague) are only coupled to the MediatorInterface and it is a good thing " +"because in OOP, one good friend is better than many. This is the key-feature of this pattern." +msgstr "" +"Alle Komponenten (genannt Kollegen) sind nur abhängig vom MediatorInterface und das ist gut so, " +"denn in der Objektorientierten Programmierung ist ein guter Freund besser als viele. Das ist das " +"beste Feature bei diesem Muster." + +#: ../../Behavioral/Mediator/README.rst:16 +msgid "UML Diagram" +msgstr "UML-Diagramm" + +#: ../../Behavioral/Mediator/README.rst:23 +msgid "Code" +msgstr "Code" + +#: ../../Behavioral/Mediator/README.rst:25 +msgid "You can also find these code on `GitHub`_" +msgstr "Du findest den Code hierzu auf `GitHub`_" + +#: ../../Behavioral/Mediator/README.rst:27 +msgid "MediatorInterface.php" +msgstr "MediatorInterface.php" + +#: ../../Behavioral/Mediator/README.rst:33 +msgid "Mediator.php" +msgstr "Mediator.php" + +#: ../../Behavioral/Mediator/README.rst:39 +msgid "Colleague.php" +msgstr "Colleague.php" + +#: ../../Behavioral/Mediator/README.rst:45 +msgid "Subsystem/Client.php" +msgstr "Subsystem/Client.php" + +#: ../../Behavioral/Mediator/README.rst:51 +msgid "Subsystem/Database.php" +msgstr "Subsystem/Database.php" + +#: ../../Behavioral/Mediator/README.rst:57 +msgid "Subsystem/Server.php" +msgstr "Subsystem/Server.php" + +#: ../../Behavioral/Mediator/README.rst:64 +msgid "Test" +msgstr "Test" + +#: ../../Behavioral/Mediator/README.rst:66 +msgid "Tests/MediatorTest.php" +msgstr "Tests/MediatorTest.php" diff --git a/locale/de/LC_MESSAGES/Behavioral/Memento/README.po b/locale/de/LC_MESSAGES/Behavioral/Memento/README.po new file mode 100644 index 0000000..9bbe94b --- /dev/null +++ b/locale/de/LC_MESSAGES/Behavioral/Memento/README.po @@ -0,0 +1,100 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2016-04-03 12:52+0200\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7\n" + +#: ../../Behavioral/Memento/README.rst:2 +msgid "`Memento`__" +msgstr "`Memento`__" + +#: ../../Behavioral/Memento/README.rst:5 +msgid "Purpose" +msgstr "Zweck" + +#: ../../Behavioral/Memento/README.rst:7 +msgid "" +"Provide the ability to restore an object to its previous state (undo via " +"rollback)." +msgstr "" +"Bietet die Möglichkeit, einen Objektzustand zu einem vorigen Zustand " +"zurückzusetzen (mit Hilfe eines Rollbacks)." + +#: ../../Behavioral/Memento/README.rst:10 +msgid "" +"The memento pattern is implemented with three objects: the originator, a " +"caretaker and a memento. The originator is some object that has an internal " +"state. The caretaker is going to do something to the originator, but wants to " +"be able to undo the change. The caretaker first asks the originator for a " +"memento object. Then it does whatever operation (or sequence of operations) it " +"was going to do. To roll back to the state before the operations, it returns " +"the memento object to the originator. The memento object itself is an opaque " +"object (one which the caretaker cannot, or should not, change). When using " +"this pattern, care should be taken if the originator may change other objects " +"or resources - the memento pattern operates on a single object." +msgstr "" +"Das Memento-Muster wird mit Hilfe von drei Objekten implementiert: der " +"Originalton, ein Caretaker und das Memento. Der Originalton ist ein Objekt, " +"das einen internen State besitzt. Der Caretaker wird etwas mit dem Originalton " +"machen, aber möchte evtl. diese Änderung auch rückgängig machen wollen. Der " +"Caretaker fragt den Originalton zuerst nach dem Memento-Objekt. Dann wird die " +"angefragte Operation (oder Sequenz von Änderungen) ausgeführt. Um diese " +"Änderung zurückzurollen, wird das Memento-Objekt an den Originalton " +"zurückgegeben. Das Memento-Objekt selbst ist intransparent, so dass der " +"Caretaker selbstständig keine Änderungen am Objekt durchführen kann. Bei der " +"Implementierung dieses Musters ist darauf zu achten, dass der Originator auch " +"Seiteneffekte auslösen kann, das Pattern aber nur auf einem einzelnen Objekt " +"operiert." + +#: ../../Behavioral/Memento/README.rst:23 +msgid "Examples" +msgstr "Beispiele" + +#: ../../Behavioral/Memento/README.rst:25 +msgid "The seed of a pseudorandom number generator" +msgstr "Das seeden eines Pseudozufallszahlengenerators" + +#: ../../Behavioral/Memento/README.rst:26 +msgid "The state in a finite state machine" +msgstr "Der State in einer FSM (Finite State Machine)" + +#: ../../Behavioral/Memento/README.rst:29 +msgid "UML Diagram" +msgstr "UML-Diagramm" + +#: ../../Behavioral/Memento/README.rst:36 +msgid "Code" +msgstr "Code" + +#: ../../Behavioral/Memento/README.rst:38 +msgid "You can also find these code on `GitHub`_" +msgstr "Du findest den Code hierzu auf `GitHub`_" + +#: ../../Behavioral/Memento/README.rst:40 +msgid "Memento.php" +msgstr "Memento.php" + +#: ../../Behavioral/Memento/README.rst:46 +msgid "Originator.php" +msgstr "Originator.php" + +#: ../../Behavioral/Memento/README.rst:52 +msgid "Caretaker.php" +msgstr "Caretaker.php" + +#: ../../Behavioral/Memento/README.rst:59 +msgid "Test" +msgstr "Test" + +#: ../../Behavioral/Memento/README.rst:61 +msgid "Tests/MementoTest.php" +msgstr "Tests/MementoTest.php" diff --git a/locale/de/LC_MESSAGES/Behavioral/NullObject/README.po b/locale/de/LC_MESSAGES/Behavioral/NullObject/README.po new file mode 100644 index 0000000..81afc76 --- /dev/null +++ b/locale/de/LC_MESSAGES/Behavioral/NullObject/README.po @@ -0,0 +1,109 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2016-04-03 12:58+0200\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7\n" + +#: ../../Behavioral/NullObject/README.rst:2 +msgid "`Null Object`__" +msgstr "`Null Object`__" + +#: ../../Behavioral/NullObject/README.rst:5 +msgid "Purpose" +msgstr "Zweck" + +#: ../../Behavioral/NullObject/README.rst:7 +msgid "" +"NullObject is not a GoF design pattern but a schema which appears frequently enough to be considered a " +"pattern. It has the following benefits:" +msgstr "" +"NullObject ist keines der Gang-Of-Four Design Patterns aber ein Muster, dass immer wieder häufig auftritt " +"und deswegen erwähnt werden sollte. Es hat folgende Vorzüge:" + +#: ../../Behavioral/NullObject/README.rst:11 +msgid "Client code is simplified" +msgstr "Client Code wird vereinfacht" + +#: ../../Behavioral/NullObject/README.rst:12 +msgid "Reduces the chance of null pointer exceptions" +msgstr "Verringert die Möglichkeit einer Nullpoint-Exception" + +#: ../../Behavioral/NullObject/README.rst:13 +msgid "Fewer conditionals require less test cases" +msgstr "Weniger Ausnahmefälle bedingen weniger Testfälle" + +#: ../../Behavioral/NullObject/README.rst:15 +msgid "" +"Methods that return an object or null should instead return an object or ``NullObject``. ``NullObject``\\ " +"s simplify boilerplate code such as ``if (!is_null($obj)) { $obj->callSomething(); }`` to just ``$obj-" +">callSomething();`` by eliminating the conditional check in client code." +msgstr "" +"Methoden, die ein Objekt oder Null zurückgeben, sollten stattdessen ein Objekt oder ``NullObject`` " +"zurückgeben. ``NullObject``s vereinfachen Boilerplate-code wie z.B. ``if (!is_null($obj)) { $obj-" +">callSomething(); }`` zu ``$obj->callSomething();``, indem sie die konditionale Prüfung im Clientcode " +"entfernen." + +#: ../../Behavioral/NullObject/README.rst:22 +msgid "Examples" +msgstr "Beispiele" + +#: ../../Behavioral/NullObject/README.rst:24 +msgid "Symfony2: null logger of profiler" +msgstr "Symfony2: Null Logger im Profiler" + +#: ../../Behavioral/NullObject/README.rst:25 +msgid "Symfony2: null output in Symfony/Console" +msgstr "Symfony 2: Null-Output in Symfony/Console" + +#: ../../Behavioral/NullObject/README.rst:26 +msgid "null handler in a Chain of Responsibilities pattern" +msgstr "Nullhandler in einem Chain Of Responsibilities Pattern " + +#: ../../Behavioral/NullObject/README.rst:27 +msgid "null command in a Command pattern" +msgstr "Null Command in einem Command-Pattern" + +#: ../../Behavioral/NullObject/README.rst:30 +msgid "UML Diagram" +msgstr "UML-Diagramm" + +#: ../../Behavioral/NullObject/README.rst:37 +msgid "Code" +msgstr "Code" + +#: ../../Behavioral/NullObject/README.rst:39 +msgid "You can also find these code on `GitHub`_" +msgstr "Du findest den Code hierzu auf `GitHub`_" + +#: ../../Behavioral/NullObject/README.rst:41 +msgid "Service.php" +msgstr "Service.php" + +#: ../../Behavioral/NullObject/README.rst:47 +msgid "LoggerInterface.php" +msgstr "LoggerInterface.php" + +#: ../../Behavioral/NullObject/README.rst:53 +msgid "PrintLogger.php" +msgstr "PrintLogger.php" + +#: ../../Behavioral/NullObject/README.rst:59 +msgid "NullLogger.php" +msgstr "NullLogger.php" + +#: ../../Behavioral/NullObject/README.rst:66 +msgid "Test" +msgstr "Test" + +#: ../../Behavioral/NullObject/README.rst:68 +msgid "Tests/LoggerTest.php" +msgstr "Tests/LoggerTest.php" diff --git a/locale/de/LC_MESSAGES/Behavioral/Observer/README.po b/locale/de/LC_MESSAGES/Behavioral/Observer/README.po new file mode 100644 index 0000000..c373b7d --- /dev/null +++ b/locale/de/LC_MESSAGES/Behavioral/Observer/README.po @@ -0,0 +1,81 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2016-04-03 14:25+0200\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7\n" + +#: ../../Behavioral/Observer/README.rst:2 +msgid "`Observer`__" +msgstr "`Observer`__" + +#: ../../Behavioral/Observer/README.rst:5 +msgid "Purpose" +msgstr "Zweck" + +#: ../../Behavioral/Observer/README.rst:7 +msgid "" +"To implement a publish/subscribe behaviour to an object, whenever a \"Subject\" object changes it's " +"state, the attached \"Observers\" will be notified. It is used to shorten the amount of coupled objects " +"and uses loose coupling instead." +msgstr "" +"Um einen Publish/Subscribe-Mechanismus in einem Objekt zu implementieren, werden bei Änderungen an " +"einem „Subject“-State die registrierten „Observer“ benachrichtigt. Es wird benutzt, um die Menge von " +"gekoppelten Objekten zu reduzieren und stattdessen eine lose Kopplung zu ermöglichen." + +#: ../../Behavioral/Observer/README.rst:13 +msgid "Examples" +msgstr "Beispiele" + +#: ../../Behavioral/Observer/README.rst:15 +msgid "a message queue system is observed to show the progress of a job in a GUI" +msgstr "" +"ein Message-Queue-System wird auf Änderungen überwacht, um den Fortschritt eines Jobs in einer GUI " +"anzuzeigen" + +#: ../../Behavioral/Observer/README.rst:19 +msgid "Note" +msgstr "Hinweis" + +#: ../../Behavioral/Observer/README.rst:21 +msgid "" +"PHP already defines two interfaces that can help to implement this pattern: SplObserver and SplSubject." +msgstr "" +"In der PHP-Standardbibliothek sind bereits zwei Interfaces enthalten, die bei der Implementierung " +"dieses Musters helfen: SplObserver und SplSubject." + +#: ../../Behavioral/Observer/README.rst:25 +msgid "UML Diagram" +msgstr "UML-Diagramm" + +#: ../../Behavioral/Observer/README.rst:32 +msgid "Code" +msgstr "Code" + +#: ../../Behavioral/Observer/README.rst:34 +msgid "You can also find these code on `GitHub`_" +msgstr "Du findest den Code hierzu auf `GitHub`_" + +#: ../../Behavioral/Observer/README.rst:36 +msgid "User.php" +msgstr "User.php" + +#: ../../Behavioral/Observer/README.rst:42 +msgid "UserObserver.php" +msgstr "UserObserver.php" + +#: ../../Behavioral/Observer/README.rst:49 +msgid "Test" +msgstr "Test" + +#: ../../Behavioral/Observer/README.rst:51 +msgid "Tests/ObserverTest.php" +msgstr "Tests/ObserverTest.php" diff --git a/locale/de/LC_MESSAGES/Behavioral/README.po b/locale/de/LC_MESSAGES/Behavioral/README.po new file mode 100644 index 0000000..a6b8847 --- /dev/null +++ b/locale/de/LC_MESSAGES/Behavioral/README.po @@ -0,0 +1,26 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2016-04-03 14:28+0200\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7\n" + +#: ../../Behavioral/README.rst:2 +msgid "`Behavioral`__" +msgstr "`Verhaltensmuster`__" + +#: ../../Behavioral/README.rst:4 +msgid "" +"In software engineering, behavioral design patterns are design patterns that identify common communication patterns between objects " +"and realize these patterns. By doing so, these patterns increase flexibility in carrying out this communication." +msgstr "" +"Design Patterns, die gängige Kommunikationsmuster zwischen mehreren Objekten definieren, sind in der Softwareentwicklung als sog. " +"Verhaltensmuster bekannt. Mit diesen Patterns kann die Flexibilität in einer Architektur signifikant verbessert werden." diff --git a/locale/de/LC_MESSAGES/Behavioral/Specification/README.po b/locale/de/LC_MESSAGES/Behavioral/Specification/README.po new file mode 100644 index 0000000..229c2a8 --- /dev/null +++ b/locale/de/LC_MESSAGES/Behavioral/Specification/README.po @@ -0,0 +1,88 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2016-04-03 14:30+0200\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7\n" + +#: ../../Behavioral/Specification/README.rst:2 +msgid "`Specification`__" +msgstr "`Specification`__" + +#: ../../Behavioral/Specification/README.rst:5 +msgid "Purpose" +msgstr "Zweck" + +#: ../../Behavioral/Specification/README.rst:7 +msgid "" +"Builds a clear specification of business rules, where objects can be checked against. The composite " +"specification class has one method called ``isSatisfiedBy`` that returns either true or false depending on " +"whether the given object satisfies the specification." +msgstr "" +"Bildet eine klare Spezifikation von Businessregeln ab, gegen die Objekte geprüft werden können. Die " +"Specification Klasse besitzt eine Methode namens ``isSatisfiedBy``, die entweder true oder false zurückgibt, " +"je nachdem ob das Objekt den Regeln des Business entspricht oder nicht." + +#: ../../Behavioral/Specification/README.rst:13 +msgid "Examples" +msgstr "Beispiele" + +#: ../../Behavioral/Specification/README.rst:15 +msgid "`RulerZ `__" +msgstr "`RulerZ `__" + +#: ../../Behavioral/Specification/README.rst:18 +msgid "UML Diagram" +msgstr "UML-Diagramm" + +#: ../../Behavioral/Specification/README.rst:25 +msgid "Code" +msgstr "Code" + +#: ../../Behavioral/Specification/README.rst:27 +msgid "You can also find these code on `GitHub`_" +msgstr "Du findest den Code hierzu auf `GitHub`_" + +#: ../../Behavioral/Specification/README.rst:29 +msgid "Item.php" +msgstr "Item.php" + +#: ../../Behavioral/Specification/README.rst:35 +msgid "SpecificationInterface.php" +msgstr "SpecificationInterface.php" + +#: ../../Behavioral/Specification/README.rst:41 +msgid "AbstractSpecification.php" +msgstr "AbstractSpecification.php" + +#: ../../Behavioral/Specification/README.rst:47 +msgid "Either.php" +msgstr "Either.php" + +#: ../../Behavioral/Specification/README.rst:53 +msgid "PriceSpecification.php" +msgstr "PriceSpecification.php" + +#: ../../Behavioral/Specification/README.rst:59 +msgid "Plus.php" +msgstr "Plus.php" + +#: ../../Behavioral/Specification/README.rst:65 +msgid "Not.php" +msgstr "Not.php" + +#: ../../Behavioral/Specification/README.rst:72 +msgid "Test" +msgstr "Test" + +#: ../../Behavioral/Specification/README.rst:74 +msgid "Tests/SpecificationTest.php" +msgstr "Tests/SpecificationTest.php" diff --git a/locale/de/LC_MESSAGES/Behavioral/State/README.po b/locale/de/LC_MESSAGES/Behavioral/State/README.po new file mode 100644 index 0000000..951c42c --- /dev/null +++ b/locale/de/LC_MESSAGES/Behavioral/State/README.po @@ -0,0 +1,68 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2016-04-03 14:32+0200\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7\n" + +#: ../../Behavioral/State/README.rst:2 +msgid "`State`__" +msgstr "`State`__" + +#: ../../Behavioral/State/README.rst:5 +msgid "Purpose" +msgstr "Zweck" + +#: ../../Behavioral/State/README.rst:7 +msgid "" +"Encapsulate varying behavior for the same routine based on an object's state. This can be a " +"cleaner way for an object to change its behavior at runtime without resorting to large " +"monolithic conditional statements." +msgstr "" +"Kapselt verschiedene Verhaltensweisen für die selbe Routine basierend auf einem Objekt-State. " +"Das kann ein sauberer Weg für ein Objekt sein, sein Verhalten während der Laufzeit ohne komplexe " +"konditionale Bedingungen ändern zu können." + +#: ../../Behavioral/State/README.rst:12 +msgid "UML Diagram" +msgstr "UML-Diagramm" + +#: ../../Behavioral/State/README.rst:19 +msgid "Code" +msgstr "Code" + +#: ../../Behavioral/State/README.rst:21 +msgid "You can also find these code on `GitHub`_" +msgstr "Du findest den Code hierzu auf `GitHub`_" + +#: ../../Behavioral/State/README.rst:23 +msgid "OrderController.php" +msgstr "OrderController.php" + +#: ../../Behavioral/State/README.rst:29 +msgid "OrderFactory.php" +msgstr "OrderFactory.php" + +#: ../../Behavioral/State/README.rst:35 +msgid "OrderInterface.php" +msgstr "OrderInterface.php" + +#: ../../Behavioral/State/README.rst:41 +msgid "ShippingOrder.php" +msgstr "ShippingOrder.php" + +#: ../../Behavioral/State/README.rst:47 +msgid "CreateOrder.php" +msgstr "CreateOrder.php" + +#: ../../Behavioral/State/README.rst:54 +msgid "Test" +msgstr "Test" diff --git a/locale/de/LC_MESSAGES/Behavioral/Strategy/README.po b/locale/de/LC_MESSAGES/Behavioral/Strategy/README.po new file mode 100644 index 0000000..cdcaf4e --- /dev/null +++ b/locale/de/LC_MESSAGES/Behavioral/Strategy/README.po @@ -0,0 +1,98 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2016-04-03 14:35+0200\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7\n" + +#: ../../Behavioral/Strategy/README.rst:2 +msgid "`Strategy`__" +msgstr "`Strategy`__" + +#: ../../Behavioral/Strategy/README.rst:5 +msgid "Terminology:" +msgstr "Terminologie:" + +#: ../../Behavioral/Strategy/README.rst:7 +msgid "Context" +msgstr "Context" + +#: ../../Behavioral/Strategy/README.rst:8 +msgid "Strategy" +msgstr "Strategy" + +#: ../../Behavioral/Strategy/README.rst:9 +msgid "Concrete Strategy" +msgstr "Concrete Strategy" + +#: ../../Behavioral/Strategy/README.rst:12 +msgid "Purpose" +msgstr "Zweck" + +#: ../../Behavioral/Strategy/README.rst:14 +msgid "" +"To separate strategies and to enable fast switching between them. Also this pattern is a good " +"alternative to inheritance (instead of having an abstract class that is extended)." +msgstr "" +"Mehrere Strategien zu trennen und schnelles Hin- und Herrschaften zwischen diesen zu ermöglichen. " +"Außerdem ist dieses Muster eine perfekte Alternative zu Vererbung von einer abstrakten Klasse." + +#: ../../Behavioral/Strategy/README.rst:19 +msgid "Examples" +msgstr "Beispiele" + +#: ../../Behavioral/Strategy/README.rst:21 +msgid "sorting a list of objects, one strategy by date, the other by id" +msgstr "" +"eine Liste an Objekten zu sortieren, wobei jede Strategie dies anhand anderer Daten vornimmt " +"(Datum, ID, etc.)" + +#: ../../Behavioral/Strategy/README.rst:22 +msgid "simplify unit testing: e.g. switching between file and in-memory storage" +msgstr "" +"Unit-Tests zu vereinfachen indem zwischen darunterliegendem Storage umgeschalten wird: Datei vs. in-" +"Memory" + +#: ../../Behavioral/Strategy/README.rst:26 +msgid "UML Diagram" +msgstr "UML-Diagramm" + +#: ../../Behavioral/Strategy/README.rst:33 +msgid "Code" +msgstr "Code" + +#: ../../Behavioral/Strategy/README.rst:35 +msgid "You can also find these code on `GitHub`_" +msgstr "Du findest den Code hierzu auf `GitHub`_" + +#: ../../Behavioral/Strategy/README.rst:37 +msgid "ObjectCollection.php" +msgstr "ObjectCollection.php" + +#: ../../Behavioral/Strategy/README.rst:43 +msgid "ComparatorInterface.php" +msgstr "ComparatorInterface.php" + +#: ../../Behavioral/Strategy/README.rst:49 +msgid "DateComparator.php" +msgstr "DateComparator.php" + +#: ../../Behavioral/Strategy/README.rst:55 +msgid "IdComparator.php" +msgstr "IdComparator.php" + +#: ../../Behavioral/Strategy/README.rst:62 +msgid "Test" +msgstr "Test" + +#: ../../Behavioral/Strategy/README.rst:64 +msgid "Tests/StrategyTest.php" +msgstr "Tests/StrategyTest.php" diff --git a/locale/de/LC_MESSAGES/Behavioral/TemplateMethod/README.po b/locale/de/LC_MESSAGES/Behavioral/TemplateMethod/README.po new file mode 100644 index 0000000..96346ae --- /dev/null +++ b/locale/de/LC_MESSAGES/Behavioral/TemplateMethod/README.po @@ -0,0 +1,86 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2016-04-03 14:40+0200\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7\n" + +#: ../../Behavioral/TemplateMethod/README.rst:2 +msgid "`Template Method`__" +msgstr "`Template Method`__" + +#: ../../Behavioral/TemplateMethod/README.rst:5 +msgid "Purpose" +msgstr "Zweck" + +#: ../../Behavioral/TemplateMethod/README.rst:7 +msgid "Template Method is a behavioral design pattern." +msgstr "Template Methode ist ein Verhaltensmuster." + +#: ../../Behavioral/TemplateMethod/README.rst:9 +msgid "" +"Perhaps you have encountered it many times already. The idea is to let subclasses of this abstract template \"finish\" " +"the behavior of an algorithm." +msgstr "" +"Vielleicht kennst du diesen Fall schon. Die Idee hierbei ist, mehrere Subklassen „finalisieren“ das Verhalten eines " +"Algorithmus." + +#: ../../Behavioral/TemplateMethod/README.rst:13 +msgid "" +"A.k.a the \"Hollywood principle\": \"Don't call us, we call you.\" This class is not called by subclasses but the " +"inverse. How? With abstraction of course." +msgstr "" +"Z.B. das „Hollywood Prinzip“: „Don’t call us, we call you.“ Diese Klasse wird nicht von der Subklasse aufgerufen, " +"sondern im Gegenteil. Das passiert über eine Abstraktion." + +#: ../../Behavioral/TemplateMethod/README.rst:17 +msgid "" +"In other words, this is a skeleton of algorithm, well-suited for framework libraries. The user has just to implement " +"one method and the superclass do the job." +msgstr "" +"In anderen Worten: es gibt ein Gerüst eines Algorithmus, bestens geeignet für eine Framework-Bibliothek. Der User kann " +"dabei eine Methode implementieren und die Superklasse übernimmt alles weitere." + +#: ../../Behavioral/TemplateMethod/README.rst:21 +msgid "It is an easy way to decouple concrete classes and reduce copy-paste, that's why you'll find it everywhere." +msgstr "Es ist ein einfacher Weg, um konkrete Klasse zu entkoppeln und Copy-Paste zu minimieren." + +#: ../../Behavioral/TemplateMethod/README.rst:25 +msgid "UML Diagram" +msgstr "UML-Diagramm" + +#: ../../Behavioral/TemplateMethod/README.rst:32 +msgid "Code" +msgstr "Code" + +#: ../../Behavioral/TemplateMethod/README.rst:34 +msgid "You can also find these code on `GitHub`_" +msgstr "Du findest den Code hierzu auf `GitHub`_" + +#: ../../Behavioral/TemplateMethod/README.rst:36 +msgid "Journey.php" +msgstr "Journey.php" + +#: ../../Behavioral/TemplateMethod/README.rst:42 +msgid "BeachJourney.php" +msgstr "BeachJourney.php" + +#: ../../Behavioral/TemplateMethod/README.rst:48 +msgid "CityJourney.php" +msgstr "CityJourney.php" + +#: ../../Behavioral/TemplateMethod/README.rst:55 +msgid "Test" +msgstr "Test" + +#: ../../Behavioral/TemplateMethod/README.rst:57 +msgid "Tests/JourneyTest.php" +msgstr "Tests/JourneyTest.php" diff --git a/locale/de/LC_MESSAGES/Behavioral/Visitor/README.po b/locale/de/LC_MESSAGES/Behavioral/Visitor/README.po new file mode 100644 index 0000000..b2792f7 --- /dev/null +++ b/locale/de/LC_MESSAGES/Behavioral/Visitor/README.po @@ -0,0 +1,80 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2016-04-03 14:43+0200\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7\n" + +#: ../../Behavioral/Visitor/README.rst:2 +msgid "`Visitor`__" +msgstr "`Visitor`__" + +#: ../../Behavioral/Visitor/README.rst:5 +msgid "Purpose" +msgstr "Zweck" + +#: ../../Behavioral/Visitor/README.rst:7 +msgid "" +"The Visitor Pattern lets you outsource operations on objects to other objects. The main reason to do " +"this is to keep a separation of concerns. But classes have to define a contract to allow visitors " +"(the ``Role::accept`` method in the example)." +msgstr "" +"Das Visitor-Muster ermöglicht es, Operationen auf Objekten an andere Objekte zu übergeben. Der " +"Hauptgrund dafür ist Separation Of Concerns. Klassen müssen dafür einen Vertrag definieren, um " +"Besucher „herein zu bitten“ (in der ``Role::accept``Methode in diesem Beispiel)." + +#: ../../Behavioral/Visitor/README.rst:12 +msgid "" +"The contract is an abstract class but you can have also a clean interface. In that case, each " +"Visitor has to choose itself which method to invoke on the visitor." +msgstr "" +"Der Vertrag ist eine Abstrakte Klasse aber diese kann auch ein sauberes Interface besitzen. In " +"diesem Fall entscheidet jeder Besucher selbst welche Methode er aufruft." + +#: ../../Behavioral/Visitor/README.rst:17 +msgid "UML Diagram" +msgstr "UML-Diagramm" + +#: ../../Behavioral/Visitor/README.rst:24 +msgid "Code" +msgstr "Code" + +#: ../../Behavioral/Visitor/README.rst:26 +msgid "You can also find these code on `GitHub`_" +msgstr "Du findest den Code hierzu auf `GitHub`_" + +#: ../../Behavioral/Visitor/README.rst:28 +msgid "RoleVisitorInterface.php" +msgstr "RoleVisitorInterface.php" + +#: ../../Behavioral/Visitor/README.rst:34 +msgid "RolePrintVisitor.php" +msgstr "RolePrintVisitor.php" + +#: ../../Behavioral/Visitor/README.rst:40 +msgid "Role.php" +msgstr "Role.php" + +#: ../../Behavioral/Visitor/README.rst:46 +msgid "User.php" +msgstr "User.php" + +#: ../../Behavioral/Visitor/README.rst:52 +msgid "Group.php" +msgstr "Group.php" + +#: ../../Behavioral/Visitor/README.rst:59 +msgid "Test" +msgstr "Test" + +#: ../../Behavioral/Visitor/README.rst:61 +msgid "Tests/VisitorTest.php" +msgstr "Tests/VisitorTest.php" diff --git a/locale/de/LC_MESSAGES/Creational/AbstractFactory/README.po b/locale/de/LC_MESSAGES/Creational/AbstractFactory/README.po new file mode 100644 index 0000000..441094c --- /dev/null +++ b/locale/de/LC_MESSAGES/Creational/AbstractFactory/README.po @@ -0,0 +1,95 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-30 22:25+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Creational/AbstractFactory/README.rst:2 +msgid "`Abstract Factory`__" +msgstr "" +"`Абстрактная фабрика `_ (`Abstract Factory`__)" + +#: ../../Creational/AbstractFactory/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Creational/AbstractFactory/README.rst:7 +msgid "" +"To create series of related or dependent objects without specifying their " +"concrete classes. Usually the created classes all implement the same " +"interface. The client of the abstract factory does not care about how these " +"objects are created, he just knows how they go together." +msgstr "" +"Создать ряд связанных или зависимых объектов без указания их конкретных " +"классов. Обычно создаваемые классы стремятся реализовать один и тот же " +"интерфейс. Клиент абстрактной фабрики не заботится о том, как создаются эти " +"объекты, он просто знает, по каким признакам они взаимосвязаны и как с ними " +"обращаться." + +#: ../../Creational/AbstractFactory/README.rst:13 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Creational/AbstractFactory/README.rst:20 +msgid "Code" +msgstr "Код" + +#: ../../Creational/AbstractFactory/README.rst:22 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Creational/AbstractFactory/README.rst:24 +msgid "AbstractFactory.php" +msgstr "AbstractFactory.php" + +#: ../../Creational/AbstractFactory/README.rst:30 +msgid "JsonFactory.php" +msgstr "JsonFactory.php" + +#: ../../Creational/AbstractFactory/README.rst:36 +msgid "HtmlFactory.php" +msgstr "HtmlFactory.php" + +#: ../../Creational/AbstractFactory/README.rst:42 +msgid "MediaInterface.php" +msgstr "MediaInterface.php" + +#: ../../Creational/AbstractFactory/README.rst:48 +msgid "Picture.php" +msgstr "Picture.php" + +#: ../../Creational/AbstractFactory/README.rst:54 +msgid "Text.php" +msgstr "Text.php" + +#: ../../Creational/AbstractFactory/README.rst:60 +msgid "Json/Picture.php" +msgstr "Json/Picture.php" + +#: ../../Creational/AbstractFactory/README.rst:66 +msgid "Json/Text.php" +msgstr "Json/Text.php" + +#: ../../Creational/AbstractFactory/README.rst:72 +msgid "Html/Picture.php" +msgstr "Html/Picture.php" + +#: ../../Creational/AbstractFactory/README.rst:78 +msgid "Html/Text.php" +msgstr "Html/Text.php" + +#: ../../Creational/AbstractFactory/README.rst:85 +msgid "Test" +msgstr "Тест" + +#: ../../Creational/AbstractFactory/README.rst:87 +msgid "Tests/AbstractFactoryTest.php" +msgstr "Tests/AbstractFactoryTest.php" diff --git a/locale/de/LC_MESSAGES/Creational/Builder/README.po b/locale/de/LC_MESSAGES/Creational/Builder/README.po new file mode 100644 index 0000000..aa92d50 --- /dev/null +++ b/locale/de/LC_MESSAGES/Creational/Builder/README.po @@ -0,0 +1,118 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-30 22:36+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Creational/Builder/README.rst:2 +msgid "`Builder`__" +msgstr "" +"`Строитель `_ (`Builder`__)" + +#: ../../Creational/Builder/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Creational/Builder/README.rst:7 +msgid "Builder is an interface that build parts of a complex object." +msgstr "Строитель — это интерфейс для производства частей сложного объекта." + +#: ../../Creational/Builder/README.rst:9 +msgid "" +"Sometimes, if the builder has a better knowledge of what it builds, this " +"interface could be an abstract class with default methods (aka adapter)." +msgstr "" +"Иногда, если Строитель лучше знает о том, что он строит, этот интерфейс " +"может быть абстрактным классом с методами по-умолчанию (адаптер)." + +#: ../../Creational/Builder/README.rst:12 +msgid "" +"If you have a complex inheritance tree for objects, it is logical to have a " +"complex inheritance tree for builders too." +msgstr "" +"Если у вас есть сложное дерево наследования для объектов, логично иметь " +"сложное дерево наследования и для их строителей." + +#: ../../Creational/Builder/README.rst:15 +msgid "" +"Note: Builders have often a fluent interface, see the mock builder of " +"PHPUnit for example." +msgstr "" +"Примечание: Строители могут иметь `текучий интерфейс `_, например, строитель макетов в PHPUnit." + +#: ../../Creational/Builder/README.rst:19 +msgid "Examples" +msgstr "Примеры" + +#: ../../Creational/Builder/README.rst:21 +msgid "PHPUnit: Mock Builder" +msgstr "PHPUnit: Mock Builder" + +#: ../../Creational/Builder/README.rst:24 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Creational/Builder/README.rst:31 +msgid "Code" +msgstr "Код" + +#: ../../Creational/Builder/README.rst:33 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Creational/Builder/README.rst:35 +msgid "Director.php" +msgstr "Director.php" + +#: ../../Creational/Builder/README.rst:41 +msgid "BuilderInterface.php" +msgstr "BuilderInterface.php" + +#: ../../Creational/Builder/README.rst:47 +msgid "BikeBuilder.php" +msgstr "BikeBuilder.php" + +#: ../../Creational/Builder/README.rst:53 +msgid "CarBuilder.php" +msgstr "CarBuilder.php" + +#: ../../Creational/Builder/README.rst:59 +msgid "Parts/Vehicle.php" +msgstr "Parts/Vehicle.php" + +#: ../../Creational/Builder/README.rst:65 +msgid "Parts/Bike.php" +msgstr "Parts/Bike.php" + +#: ../../Creational/Builder/README.rst:71 +msgid "Parts/Car.php" +msgstr "Parts/Car.php" + +#: ../../Creational/Builder/README.rst:77 +msgid "Parts/Engine.php" +msgstr "Parts/Engine.php" + +#: ../../Creational/Builder/README.rst:83 +msgid "Parts/Wheel.php" +msgstr "Parts/Wheel.php" + +#: ../../Creational/Builder/README.rst:89 +msgid "Parts/Door.php" +msgstr "Parts/Door.php" + +#: ../../Creational/Builder/README.rst:96 +msgid "Test" +msgstr "Тест" + +#: ../../Creational/Builder/README.rst:98 +msgid "Tests/DirectorTest.php" +msgstr "Tests/DirectorTest.php" diff --git a/locale/de/LC_MESSAGES/Creational/FactoryMethod/README.po b/locale/de/LC_MESSAGES/Creational/FactoryMethod/README.po new file mode 100644 index 0000000..916f12b --- /dev/null +++ b/locale/de/LC_MESSAGES/Creational/FactoryMethod/README.po @@ -0,0 +1,101 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-30 22:46+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Creational/FactoryMethod/README.rst:2 +msgid "`Factory Method`__" +msgstr "" +"`Фабричный Метод `_ (`Factory Method`__)" + +#: ../../Creational/FactoryMethod/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Creational/FactoryMethod/README.rst:7 +msgid "" +"The good point over the SimpleFactory is you can subclass it to implement " +"different ways to create objects" +msgstr "" +"Выгодное отличие от SimpleFactory в том, что вы можете вынести реализацию " +"создания объектов в подклассы." + +#: ../../Creational/FactoryMethod/README.rst:10 +msgid "For simple case, this abstract class could be just an interface" +msgstr "" +"В простых случаях, этот абстрактный класс может быть только интерфейсом." + +#: ../../Creational/FactoryMethod/README.rst:12 +msgid "" +"This pattern is a \"real\" Design Pattern because it achieves the " +"\"Dependency Inversion Principle\" a.k.a the \"D\" in S.O.L.I.D principles." +msgstr "" +"Этот паттерн является «настоящим» Шаблоном Проектирования, потому что он " +"следует «Принципу инверсии зависимостей\" ака \"D\" в `S.O.L.I.D `_." + +#: ../../Creational/FactoryMethod/README.rst:15 +msgid "" +"It means the FactoryMethod class depends on abstractions, not concrete " +"classes. This is the real trick compared to SimpleFactory or StaticFactory." +msgstr "" +"Это означает, что класс FactoryMethod зависит от абстракций, а не от " +"конкретных классов. Это существенный плюс в сравнении с SimpleFactory или " +"StaticFactory." + +#: ../../Creational/FactoryMethod/README.rst:20 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Creational/FactoryMethod/README.rst:27 +msgid "Code" +msgstr "Код" + +#: ../../Creational/FactoryMethod/README.rst:29 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Creational/FactoryMethod/README.rst:31 +msgid "FactoryMethod.php" +msgstr "FactoryMethod.php" + +#: ../../Creational/FactoryMethod/README.rst:37 +msgid "ItalianFactory.php" +msgstr "ItalianFactory.php" + +#: ../../Creational/FactoryMethod/README.rst:43 +msgid "GermanFactory.php" +msgstr "GermanFactory.php" + +#: ../../Creational/FactoryMethod/README.rst:49 +msgid "VehicleInterface.php" +msgstr "VehicleInterface.php" + +#: ../../Creational/FactoryMethod/README.rst:55 +msgid "Porsche.php" +msgstr "Porsche.php" + +#: ../../Creational/FactoryMethod/README.rst:61 +msgid "Bicycle.php" +msgstr "Bicycle.php" + +#: ../../Creational/FactoryMethod/README.rst:67 +msgid "Ferrari.php" +msgstr "Ferrari.php" + +#: ../../Creational/FactoryMethod/README.rst:74 +msgid "Test" +msgstr "Тест" + +#: ../../Creational/FactoryMethod/README.rst:76 +msgid "Tests/FactoryMethodTest.php" +msgstr "Tests/FactoryMethodTest.php" diff --git a/locale/de/LC_MESSAGES/Creational/Multiton/README.po b/locale/de/LC_MESSAGES/Creational/Multiton/README.po new file mode 100644 index 0000000..509a9c0 --- /dev/null +++ b/locale/de/LC_MESSAGES/Creational/Multiton/README.po @@ -0,0 +1,72 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-30 22:58+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Creational/Multiton/README.rst:2 +msgid "Multiton" +msgstr "Пул одиночек (Multiton)" + +#: ../../Creational/Multiton/README.rst:4 +msgid "" +"**THIS IS CONSIDERED TO BE AN ANTI-PATTERN! FOR BETTER TESTABILITY AND " +"MAINTAINABILITY USE DEPENDENCY INJECTION!**" +msgstr "" +"**Это считается анти-паттерном! Для лучшей тестируемости и сопровождения " +"кода используйте Инъекцию Зависимости (Dependency Injection)!**" + +#: ../../Creational/Multiton/README.rst:8 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Creational/Multiton/README.rst:10 +msgid "" +"To have only a list of named instances that are used, like a singleton but " +"with n instances." +msgstr "" +"Содержит список именованных созданных экземпляров классов, которые в итоге " +"используются как Singleton-ы, но в заданном заранее N-ном количестве." + +#: ../../Creational/Multiton/README.rst:14 +msgid "Examples" +msgstr "Примеры" + +#: ../../Creational/Multiton/README.rst:16 +msgid "2 DB Connectors, e.g. one for MySQL, the other for SQLite" +msgstr "" +"Два объекта для доступа к базам данных, к примеру, один для MySQL, а " +"второй для SQLite" + +#: ../../Creational/Multiton/README.rst:17 +msgid "multiple Loggers (one for debug messages, one for errors)" +msgstr "" +"Несколько логгирующих объектов (один для отладочных сообщений, другой для " +"ошибок и т.п.) " + +#: ../../Creational/Multiton/README.rst:20 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Creational/Multiton/README.rst:27 +msgid "Code" +msgstr "Код" + +#: ../../Creational/Multiton/README.rst:29 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Creational/Multiton/README.rst:31 +msgid "Multiton.php" +msgstr "Multiton.php" + +#: ../../Creational/Multiton/README.rst:38 +msgid "Test" +msgstr "Тест" diff --git a/locale/de/LC_MESSAGES/Creational/Pool/README.po b/locale/de/LC_MESSAGES/Creational/Pool/README.po new file mode 100644 index 0000000..8c679b4 --- /dev/null +++ b/locale/de/LC_MESSAGES/Creational/Pool/README.po @@ -0,0 +1,98 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-30 23:08+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Creational/Pool/README.rst:2 +msgid "`Pool`__" +msgstr "" +"`Объектный пул `_ (`Pool`__)" + +#: ../../Creational/Pool/README.rst:4 +msgid "" +"The **object pool pattern** is a software creational design pattern that " +"uses a set of initialized objects kept ready to use – a \"pool\" – rather " +"than allocating and destroying them on demand. A client of the pool will " +"request an object from the pool and perform operations on the returned " +"object. When the client has finished, it returns the object, which is a " +"specific type of factory object, to the pool rather than destroying it." +msgstr "" +"Порождающий паттерн, который предоставляет набор заранее инициализированных " +"объектов, готовых к использованию («пул»), что не требует каждый раз " +"создавать и уничтожать их." + +#: ../../Creational/Pool/README.rst:11 +msgid "" +"Object pooling can offer a significant performance boost in situations where" +" the cost of initializing a class instance is high, the rate of " +"instantiation of a class is high, and the number of instances in use at any " +"one time is low. The pooled object is obtained in predictable time when " +"creation of the new objects (especially over network) may take variable " +"time." +msgstr "" +"Хранение объектов в пуле может заметно повысить производительность в " +"ситуациях, когда стоимость инициализации экземпляра класса высока, скорость " +"экземпляра класса высока, а количество одновременно используемых " +"экземпляров в любой момент времени является низкой. Время на извлечение " +"объекта из пула легко прогнозируется, в отличие от создания новых объектов " +"(особенно с сетевым оверхедом), что занимает неопределённое время." + +#: ../../Creational/Pool/README.rst:18 +msgid "" +"However these benefits are mostly true for objects that are expensive with " +"respect to time, such as database connections, socket connections, threads " +"and large graphic objects like fonts or bitmaps. In certain situations, " +"simple object pooling (that hold no external resources, but only occupy " +"memory) may not be efficient and could decrease performance." +msgstr "" +"Однако эти преимущества в основном относится к объектам, которые изначально " +"являются дорогостоящими по времени создания. Например, соединения с базой " +"данных, соединения сокетов, потоков и инициализация больших графических " +"объектов, таких как шрифты или растровые изображения. В некоторых " +"ситуациях, использование простого пула объектов (которые не зависят от " +"внешних ресурсов, а только занимают память) может оказаться неэффективным и " +"приведёт к снижению производительности." + +#: ../../Creational/Pool/README.rst:25 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Creational/Pool/README.rst:32 +msgid "Code" +msgstr "Код" + +#: ../../Creational/Pool/README.rst:34 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Creational/Pool/README.rst:36 +msgid "Pool.php" +msgstr "Pool.php" + +#: ../../Creational/Pool/README.rst:42 +msgid "Processor.php" +msgstr "Processor.php" + +#: ../../Creational/Pool/README.rst:48 +msgid "Worker.php" +msgstr "Worker.php" + +#: ../../Creational/Pool/README.rst:55 +msgid "Test" +msgstr "Тест" + +#: ../../Creational/Pool/README.rst:57 +msgid "Tests/PoolTest.php" +msgstr "Tests/PoolTest.php" + +#: ../../Creational/Pool/README.rst:63 +msgid "Tests/TestWorker.php" +msgstr "Tests/TestWorker.php" diff --git a/locale/de/LC_MESSAGES/Creational/Prototype/README.po b/locale/de/LC_MESSAGES/Creational/Prototype/README.po new file mode 100644 index 0000000..f249bce --- /dev/null +++ b/locale/de/LC_MESSAGES/Creational/Prototype/README.po @@ -0,0 +1,74 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-30 23:13+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Creational/Prototype/README.rst:2 +msgid "`Prototype`__" +msgstr "" +"`Прототип `_ (`Prototype`__)" + +#: ../../Creational/Prototype/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Creational/Prototype/README.rst:7 +msgid "" +"To avoid the cost of creating objects the standard way (new Foo()) and " +"instead create a prototype and clone it." +msgstr "" +"Помогает избежать затрат на создание объектов стандартным способом (new " +"Foo()), а вместо этого создаёт прототип и затем клонирует его." + +#: ../../Creational/Prototype/README.rst:11 +msgid "Examples" +msgstr "Примеры" + +#: ../../Creational/Prototype/README.rst:13 +msgid "" +"Large amounts of data (e.g. create 1,000,000 rows in a database at once via " +"a ORM)." +msgstr "" +"Большие объемы данных (например, создать 1000000 строк в базе данных сразу " +"через ORM)." + +#: ../../Creational/Prototype/README.rst:17 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Creational/Prototype/README.rst:24 +msgid "Code" +msgstr "Код" + +#: ../../Creational/Prototype/README.rst:26 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Creational/Prototype/README.rst:28 +msgid "index.php" +msgstr "index.php" + +#: ../../Creational/Prototype/README.rst:34 +msgid "BookPrototype.php" +msgstr "BookPrototype.php" + +#: ../../Creational/Prototype/README.rst:40 +msgid "BarBookPrototype.php" +msgstr "BarBookPrototype.php" + +#: ../../Creational/Prototype/README.rst:46 +msgid "FooBookPrototype.php" +msgstr "FooBookPrototype.php" + +#: ../../Creational/Prototype/README.rst:53 +msgid "Test" +msgstr "Тест" diff --git a/locale/de/LC_MESSAGES/Creational/README.po b/locale/de/LC_MESSAGES/Creational/README.po new file mode 100644 index 0000000..7f5c8f8 --- /dev/null +++ b/locale/de/LC_MESSAGES/Creational/README.po @@ -0,0 +1,31 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-30 23:11+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Creational/README.rst:2 +msgid "`Creational`__" +msgstr "Порождающие шаблоны проектирования (`Creational`__)" + +#: ../../Creational/README.rst:4 +msgid "" +"In software engineering, creational design patterns are design patterns that" +" deal with object creation mechanisms, trying to create objects in a manner " +"suitable to the situation. The basic form of object creation could result in" +" design problems or added complexity to the design. Creational design " +"patterns solve this problem by somehow controlling this object creation." +msgstr "" +"В разработке программного обеспечения, Порождающие шаблоны проектирования – " +"это паттерны, которые имеют дело с механизмами создания объекта и пытаются " +"создать объекты в порядке, подходящем к ситуации. Обычная форма создания " +"объекта может привести к проблемам проектирования или увеличивать сложность " +"конструкции. Порождающие шаблоны проектирования решают эту проблему, " +"определённым образом контролируя процесс создания объекта." diff --git a/locale/de/LC_MESSAGES/Creational/SimpleFactory/README.po b/locale/de/LC_MESSAGES/Creational/SimpleFactory/README.po new file mode 100644 index 0000000..6e07bbd --- /dev/null +++ b/locale/de/LC_MESSAGES/Creational/SimpleFactory/README.po @@ -0,0 +1,77 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-30 23:17+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Creational/SimpleFactory/README.rst:2 +msgid "Simple Factory" +msgstr "Простая Фабрика (Simple Factory)" + +#: ../../Creational/SimpleFactory/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Creational/SimpleFactory/README.rst:7 +msgid "SimpleFactory is a simple factory pattern." +msgstr "SimpleFactory в примере ниже, это паттерн «Простая Фабрика»." + +#: ../../Creational/SimpleFactory/README.rst:9 +msgid "" +"It differs from the static factory because it is NOT static and as you know:" +" static => global => evil!" +msgstr "" +"Она отличается от Статической Фабрики тем, что собственно *не является " +"статической*. Потому как вы должны знаеть: статическая => глобальная => зло!" + +#: ../../Creational/SimpleFactory/README.rst:12 +msgid "" +"Therefore, you can have multiple factories, differently parametrized, you " +"can subclass it and you can mock-up it." +msgstr "" +"Таким образом, вы можете иметь несколько фабрик, параметризованных " +"различным образом. Вы можете унаследовать их и создавать макеты для " +"тестирования." + +#: ../../Creational/SimpleFactory/README.rst:16 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Creational/SimpleFactory/README.rst:23 +msgid "Code" +msgstr "Код" + +#: ../../Creational/SimpleFactory/README.rst:25 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Creational/SimpleFactory/README.rst:27 +msgid "SimpleFactory.php" +msgstr "SimpleFactory.php" + +#: ../../Creational/SimpleFactory/README.rst:33 +msgid "VehicleInterface.php" +msgstr "VehicleInterface.php" + +#: ../../Creational/SimpleFactory/README.rst:39 +msgid "Bicycle.php" +msgstr "Bicycle.php" + +#: ../../Creational/SimpleFactory/README.rst:45 +msgid "Scooter.php" +msgstr "Scooter.php" + +#: ../../Creational/SimpleFactory/README.rst:52 +msgid "Test" +msgstr "Тест" + +#: ../../Creational/SimpleFactory/README.rst:54 +msgid "Tests/SimpleFactoryTest.php" +msgstr "Tests/SimpleFactoryTest.php" diff --git a/locale/de/LC_MESSAGES/Creational/Singleton/README.po b/locale/de/LC_MESSAGES/Creational/Singleton/README.po new file mode 100644 index 0000000..15c9e62 --- /dev/null +++ b/locale/de/LC_MESSAGES/Creational/Singleton/README.po @@ -0,0 +1,87 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-30 23:20+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Creational/Singleton/README.rst:2 +msgid "`Singleton`__" +msgstr "" +"`Одиночка `_ (`Singleton`__)" + +#: ../../Creational/Singleton/README.rst:4 +msgid "" +"**THIS IS CONSIDERED TO BE AN ANTI-PATTERN! FOR BETTER TESTABILITY AND " +"MAINTAINABILITY USE DEPENDENCY INJECTION!**" +msgstr "" +"**Это считается анти-паттерном! Для лучшей тестируемости и " +"сопровождения кода используйте Инъекцию Зависимости (Dependency " +"Injection)!**" + +#: ../../Creational/Singleton/README.rst:8 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Creational/Singleton/README.rst:10 +msgid "" +"To have only one instance of this object in the application that will handle" +" all calls." +msgstr "" +"Позволяет содержать только один экземпляр объекта в приложении, " +"которое будет обрабатывать все обращения, запрещая создавать новый " +"экземпляр." + +#: ../../Creational/Singleton/README.rst:14 +msgid "Examples" +msgstr "Примеры" + +#: ../../Creational/Singleton/README.rst:16 +msgid "DB Connector" +msgstr "DB Connector для подключения к базе данных" + +#: ../../Creational/Singleton/README.rst:17 +msgid "" +"Logger (may also be a Multiton if there are many log files for several " +"purposes)" +msgstr "" +"Logger (также может быть Multiton если есть много журналов для " +"нескольких целей)" + +#: ../../Creational/Singleton/README.rst:19 +msgid "" +"Lock file for the application (there is only one in the filesystem ...)" +msgstr "" +"Блокировка файла в приложении (есть только один в файловой системе с " +"одновременным доступом к нему)" + +#: ../../Creational/Singleton/README.rst:23 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Creational/Singleton/README.rst:30 +msgid "Code" +msgstr "Код" + +#: ../../Creational/Singleton/README.rst:32 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Creational/Singleton/README.rst:34 +msgid "Singleton.php" +msgstr "Singleton.php" + +#: ../../Creational/Singleton/README.rst:41 +msgid "Test" +msgstr "Тест" + +#: ../../Creational/Singleton/README.rst:43 +msgid "Tests/SingletonTest.php" +msgstr "Tests/SingletonTest.php" diff --git a/locale/de/LC_MESSAGES/Creational/StaticFactory/README.po b/locale/de/LC_MESSAGES/Creational/StaticFactory/README.po new file mode 100644 index 0000000..805d0ff --- /dev/null +++ b/locale/de/LC_MESSAGES/Creational/StaticFactory/README.po @@ -0,0 +1,82 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-30 23:24+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Creational/StaticFactory/README.rst:2 +msgid "Static Factory" +msgstr "Статическая Фабрика (Static Factory)" + +#: ../../Creational/StaticFactory/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Creational/StaticFactory/README.rst:7 +msgid "" +"Similar to the AbstractFactory, this pattern is used to create series of " +"related or dependent objects. The difference between this and the abstract " +"factory pattern is that the static factory pattern uses just one static " +"method to create all types of objects it can create. It is usually named " +"``factory`` or ``build``." +msgstr "" +"Подобно AbstractFactory, этот паттерн используется для создания ряда " +"связанных или зависимых объектов. Разница между этим шаблоном и Абстрактной " +"Фабрикой заключается в том, что Статическая Фабрика использует только один " +"статический метод, чтобы создать все допустимые типы объектов. Этот метод, " +"обычно, называется ``factory`` или ``build``." + +#: ../../Creational/StaticFactory/README.rst:14 +msgid "Examples" +msgstr "Примеры" + +#: ../../Creational/StaticFactory/README.rst:16 +msgid "" +"Zend Framework: ``Zend_Cache_Backend`` or ``_Frontend`` use a factory method" +" create cache backends or frontends" +msgstr "" +"Zend Framework: ``Zend_Cache_Backend`` или ``_Frontend`` использует " +"фабричный метод для создания cache backends или frontends" + +#: ../../Creational/StaticFactory/README.rst:20 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Creational/StaticFactory/README.rst:27 +msgid "Code" +msgstr "Код" + +#: ../../Creational/StaticFactory/README.rst:29 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Creational/StaticFactory/README.rst:31 +msgid "StaticFactory.php" +msgstr "StaticFactory.php" + +#: ../../Creational/StaticFactory/README.rst:37 +msgid "FormatterInterface.php" +msgstr "FormatterInterface.php" + +#: ../../Creational/StaticFactory/README.rst:43 +msgid "FormatString.php" +msgstr "FormatString.php" + +#: ../../Creational/StaticFactory/README.rst:49 +msgid "FormatNumber.php" +msgstr "FormatNumber.php" + +#: ../../Creational/StaticFactory/README.rst:56 +msgid "Test" +msgstr "Тест" + +#: ../../Creational/StaticFactory/README.rst:58 +msgid "Tests/StaticFactoryTest.php" +msgstr "Tests/StaticFactoryTest.php" diff --git a/locale/de/LC_MESSAGES/More/Delegation/README.po b/locale/de/LC_MESSAGES/More/Delegation/README.po new file mode 100644 index 0000000..c33f3dc --- /dev/null +++ b/locale/de/LC_MESSAGES/More/Delegation/README.po @@ -0,0 +1,60 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-30 04:46+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../More/Delegation/README.rst:2 +msgid "`Delegation`__" +msgstr "`Делегирование `_ (`Delegation`__)" + +#: ../../More/Delegation/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../More/Delegation/README.rst:7 ../../More/Delegation/README.rst:12 +msgid "..." +msgstr "Основной шаблон проектирования, в котором объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту. Шаблон делегирования является фундаментальной абстракцией, на основе которой реализованы другие шаблоны - композиция (также называемая агрегацией), примеси (mixins) и аспекты (aspects). (c) wiki" + +#: ../../More/Delegation/README.rst:10 +msgid "Examples" +msgstr "Примеры" + +#: ../../More/Delegation/README.rst:15 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../More/Delegation/README.rst:22 +msgid "Code" +msgstr "Код" + +#: ../../More/Delegation/README.rst:24 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../More/Delegation/README.rst:26 +msgid "Usage.php" +msgstr "Usage.php" + +#: ../../More/Delegation/README.rst:32 +msgid "TeamLead.php" +msgstr "TeamLead.php" + +#: ../../More/Delegation/README.rst:38 +msgid "JuniorDeveloper.php" +msgstr "JuniorDeveloper.php" + +#: ../../More/Delegation/README.rst:45 +msgid "Test" +msgstr "Тест" + +#: ../../More/Delegation/README.rst:47 +msgid "Tests/DelegationTest.php" +msgstr "Tests/DelegationTest.php" diff --git a/locale/de/LC_MESSAGES/More/README.po b/locale/de/LC_MESSAGES/More/README.po new file mode 100644 index 0000000..24d65fc --- /dev/null +++ b/locale/de/LC_MESSAGES/More/README.po @@ -0,0 +1,16 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../More/README.rst:2 +msgid "More" +msgstr "Дополнительно" diff --git a/locale/de/LC_MESSAGES/More/Repository/README.po b/locale/de/LC_MESSAGES/More/Repository/README.po new file mode 100644 index 0000000..5b9ec98 --- /dev/null +++ b/locale/de/LC_MESSAGES/More/Repository/README.po @@ -0,0 +1,85 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-30 05:02+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../More/Repository/README.rst:2 +msgid "Repository" +msgstr "Хранилище (Repository)" + +#: ../../More/Repository/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../More/Repository/README.rst:7 +msgid "" +"Mediates between the domain and data mapping layers using a collection-like " +"interface for accessing domain objects. Repository encapsulates the set of " +"objects persisted in a data store and the operations performed over them, " +"providing a more object-oriented view of the persistence layer. Repository " +"also supports the objective of achieving a clean separation and one-way " +"dependency between the domain and data mapping layers." +msgstr "" +"Посредник между уровнями области определения (хранилище) и распределения " +"данных. Использует интерфейс, похожий на коллекции, для доступа к объектам " +"области определения. Репозиторий инкапсулирует набор объектов, сохраняемых " +"в хранилище данных, и операции выполняемые над ними, обеспечивая более " +"объектно-ориентированное представление реальных данных. Репозиторий также " +"преследует цель достижения полного разделения и односторонней зависимости " +"между уровнями области определения и распределения данных." + +#: ../../More/Repository/README.rst:16 +msgid "Examples" +msgstr "Примеры" + +#: ../../More/Repository/README.rst:18 +msgid "" +"Doctrine 2 ORM: there is Repository that mediates between Entity and DBAL " +"and contains methods to retrieve objects" +msgstr "" +"Doctrine 2 ORM: в ней есть Repository, который является связующим звеном " +"между Entity и DBAL и содержит методы для получения объектов." + +#: ../../More/Repository/README.rst:20 +msgid "Laravel Framework" +msgstr "Laravel Framework" + +#: ../../More/Repository/README.rst:23 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../More/Repository/README.rst:30 +msgid "Code" +msgstr "Код" + +#: ../../More/Repository/README.rst:32 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../More/Repository/README.rst:34 +msgid "Post.php" +msgstr "Post.php" + +#: ../../More/Repository/README.rst:40 +msgid "PostRepository.php" +msgstr "PostRepository.php" + +#: ../../More/Repository/README.rst:46 +msgid "Storage.php" +msgstr "Storage.php" + +#: ../../More/Repository/README.rst:52 +msgid "MemoryStorage.php" +msgstr "MemoryStorage.php" + +#: ../../More/Repository/README.rst:59 +msgid "Test" +msgstr "Тест" diff --git a/locale/de/LC_MESSAGES/More/ServiceLocator/README.po b/locale/de/LC_MESSAGES/More/ServiceLocator/README.po new file mode 100644 index 0000000..4124706 --- /dev/null +++ b/locale/de/LC_MESSAGES/More/ServiceLocator/README.po @@ -0,0 +1,107 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-30 05:14+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../More/ServiceLocator/README.rst:2 +msgid "`Service Locator`__" +msgstr "Локатор Служб (`Service Locator`__)" + +#: ../../More/ServiceLocator/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../More/ServiceLocator/README.rst:7 +msgid "" +"To implement a loosely coupled architecture in order to get better testable," +" maintainable and extendable code. DI pattern and Service Locator pattern " +"are an implementation of the Inverse of Control pattern." +msgstr "" +"Для реализации слабосвязанной архитектуры, чтобы получить хорошо " +"тестируемый, сопровождаемый и расширяемый код. Паттерн Инъекция " +"зависимостей (DI) и паттерн Локатор Служб — это реализация паттерна " +"Инверсия управления (Inversion of Control, IoC)." + +#: ../../More/ServiceLocator/README.rst:12 +msgid "Usage" +msgstr "Использование" + +#: ../../More/ServiceLocator/README.rst:14 +msgid "" +"With ``ServiceLocator`` you can register a service for a given interface. By" +" using the interface you can retrieve the service and use it in the classes " +"of the application without knowing its implementation. You can configure and" +" inject the Service Locator object on bootstrap." +msgstr "" +"С ``Локатором Служб`` вы можете зарегистрировать сервис для определенного " +"интерфейса. С помощью интерфейса вы можете получить зарегистрированный " +"сервис и использовать его в классах приложения, не зная его реализацию. Вы " +"можете настроить и внедрить объект Service Locator на начальном этапе " +"сборки приложения." + +#: ../../More/ServiceLocator/README.rst:20 +msgid "Examples" +msgstr "Примеры" + +#: ../../More/ServiceLocator/README.rst:22 +msgid "" +"Zend Framework 2 uses Service Locator to create and share services used in " +"the framework(i.e. EventManager, ModuleManager, all custom user services " +"provided by modules, etc...)" +msgstr "" +"Zend Framework 2 использует Service Locator для создания и совместного " +"использования сервисов, задействованных в фреймворке (т.е. EventManager, " +"ModuleManager, все пользовательские сервисы, предоставляемые модулями, и т." +"д ...)" + +#: ../../More/ServiceLocator/README.rst:27 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../More/ServiceLocator/README.rst:34 +msgid "Code" +msgstr "Код" + +#: ../../More/ServiceLocator/README.rst:36 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../More/ServiceLocator/README.rst:38 +msgid "ServiceLocatorInterface.php" +msgstr "ServiceLocatorInterface.php" + +#: ../../More/ServiceLocator/README.rst:44 +msgid "ServiceLocator.php" +msgstr "ServiceLocator.php" + +#: ../../More/ServiceLocator/README.rst:50 +msgid "LogServiceInterface.php" +msgstr "LogServiceInterface.php" + +#: ../../More/ServiceLocator/README.rst:56 +msgid "LogService.php" +msgstr "LogService.php" + +#: ../../More/ServiceLocator/README.rst:62 +msgid "DatabaseServiceInterface.php" +msgstr "DatabaseServiceInterface.php" + +#: ../../More/ServiceLocator/README.rst:68 +msgid "DatabaseService.php" +msgstr "DatabaseService.php" + +#: ../../More/ServiceLocator/README.rst:75 +msgid "Test" +msgstr "Тест" + +#: ../../More/ServiceLocator/README.rst:77 +msgid "Tests/ServiceLocatorTest.php" +msgstr "Tests/ServiceLocatorTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/Adapter/README.po b/locale/de/LC_MESSAGES/Structural/Adapter/README.po new file mode 100644 index 0000000..b56001b --- /dev/null +++ b/locale/de/LC_MESSAGES/Structural/Adapter/README.po @@ -0,0 +1,92 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-31 14:58+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Structural/Adapter/README.rst:2 +msgid "`Adapter / Wrapper`__" +msgstr "" +"`Адаптер `_ " +"(`Adapter / Wrapper`__)" + +#: ../../Structural/Adapter/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Structural/Adapter/README.rst:7 +msgid "" +"To translate one interface for a class into a compatible interface. An " +"adapter allows classes to work together that normally could not because of " +"incompatible interfaces by providing it's interface to clients while using " +"the original interface." +msgstr "" +"Привести нестандартный или неудобный интерфейс какого-то класса в " +"интерфейс, совместимый с вашим кодом. Адаптер позволяет классам работать " +"вместе стандартным образом, что обычно не получается из-за несовместимых " +"интерфейсов, предоставляя для этого прослойку с интерфейсом, удобным для " +"клиентов, самостоятельно используя оригинальный интерфейс." + +#: ../../Structural/Adapter/README.rst:13 +msgid "Examples" +msgstr "Примеры" + +#: ../../Structural/Adapter/README.rst:15 +msgid "DB Client libraries adapter" +msgstr "Адаптер клиентских библиотек для работы с базами данных" + +#: ../../Structural/Adapter/README.rst:16 +msgid "" +"using multiple different webservices and adapters normalize data so that the" +" outcome is the same for all" +msgstr "" +"нормализовать данные нескольких различных веб-сервисов, в одинаковую " +"структуру, как будто вы работаете со стандартным сервисом (например при " +"работе с API соцсетей)" + +#: ../../Structural/Adapter/README.rst:20 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Structural/Adapter/README.rst:27 +msgid "Code" +msgstr "Код" + +#: ../../Structural/Adapter/README.rst:29 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Structural/Adapter/README.rst:31 +msgid "PaperBookInterface.php" +msgstr "PaperBookInterface.php" + +#: ../../Structural/Adapter/README.rst:37 +msgid "Book.php" +msgstr "Book.php" + +#: ../../Structural/Adapter/README.rst:43 +msgid "EBookAdapter.php" +msgstr "EBookAdapter.php" + +#: ../../Structural/Adapter/README.rst:49 +msgid "EBookInterface.php" +msgstr "EBookInterface.php" + +#: ../../Structural/Adapter/README.rst:55 +msgid "Kindle.php" +msgstr "Kindle.php" + +#: ../../Structural/Adapter/README.rst:62 +msgid "Test" +msgstr "Тест" + +#: ../../Structural/Adapter/README.rst:64 +msgid "Tests/AdapterTest.php" +msgstr "Tests/AdapterTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/Bridge/README.po b/locale/de/LC_MESSAGES/Structural/Bridge/README.po new file mode 100644 index 0000000..9e7356e --- /dev/null +++ b/locale/de/LC_MESSAGES/Structural/Bridge/README.po @@ -0,0 +1,83 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-06-02 00:24+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Structural/Bridge/README.rst:2 +msgid "`Bridge`__" +msgstr "" +"`Мост `_ " +"(`Bridge`__)" + +#: ../../Structural/Bridge/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Structural/Bridge/README.rst:7 +msgid "" +"Decouple an abstraction from its implementation so that the two can vary " +"independently." +msgstr "" +"Отделить абстракцию от её реализации так, что они могут изменяться " +"независимо друг от друга." + +#: ../../Structural/Bridge/README.rst:11 +msgid "Sample:" +msgstr "Пример:" + +#: ../../Structural/Bridge/README.rst:13 +msgid "`Symfony DoctrineBridge `__" +msgstr "" +"`Symfony DoctrineBridge `__" + +#: ../../Structural/Bridge/README.rst:17 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Structural/Bridge/README.rst:24 +msgid "Code" +msgstr "Код" + +#: ../../Structural/Bridge/README.rst:26 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Structural/Bridge/README.rst:28 +msgid "Workshop.php" +msgstr "Workshop.php" + +#: ../../Structural/Bridge/README.rst:34 +msgid "Assemble.php" +msgstr "Assemble.php" + +#: ../../Structural/Bridge/README.rst:40 +msgid "Produce.php" +msgstr "Produce.php" + +#: ../../Structural/Bridge/README.rst:46 +msgid "Vehicle.php" +msgstr "Vehicle.php" + +#: ../../Structural/Bridge/README.rst:52 +msgid "Motorcycle.php" +msgstr "Motorcycle.php" + +#: ../../Structural/Bridge/README.rst:58 +msgid "Car.php" +msgstr "Car.php" + +#: ../../Structural/Bridge/README.rst:65 +msgid "Test" +msgstr "Тест" + +#: ../../Structural/Bridge/README.rst:67 +msgid "Tests/BridgeTest.php" +msgstr "Tests/BridgeTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/Composite/README.po b/locale/de/LC_MESSAGES/Structural/Composite/README.po new file mode 100644 index 0000000..70c622b --- /dev/null +++ b/locale/de/LC_MESSAGES/Structural/Composite/README.po @@ -0,0 +1,87 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-06-02 00:33+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Structural/Composite/README.rst:2 +msgid "`Composite`__" +msgstr "" +"`Компоновщик `_ (`Composite`__)" + +#: ../../Structural/Composite/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Structural/Composite/README.rst:7 +msgid "" +"To treat a group of objects the same way as a single instance of the object." +msgstr "" +"Взаимодействие с иерархической группой объектов также, как и с отдельно " +"взятым экземпляром." + +#: ../../Structural/Composite/README.rst:11 +msgid "Examples" +msgstr "Примеры" + +#: ../../Structural/Composite/README.rst:13 +msgid "" +"a form class instance handles all its form elements like a single instance " +"of the form, when ``render()`` is called, it subsequently runs through all " +"its child elements and calls ``render()`` on them" +msgstr "" +"Экземпляр класса Form обрабатывает все свои элементы формы, как будто это " +"один экземпляр. И когда вызывается метод ``render()``, он перебирает все " +"дочерние элементы и вызывает их собственный ``render()``." + +#: ../../Structural/Composite/README.rst:16 +msgid "" +"``Zend_Config``: a tree of configuration options, each one is a " +"``Zend_Config`` object itself" +msgstr "" +"``Zend_Config``: дерево вариантов конфигурации, где каждая из конфигураций " +"тоже представляет собой объект ``Zend_Config``" + +#: ../../Structural/Composite/README.rst:20 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Structural/Composite/README.rst:27 +msgid "Code" +msgstr "Код" + +#: ../../Structural/Composite/README.rst:29 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Structural/Composite/README.rst:31 +msgid "FormElement.php" +msgstr "FormElement.php" + +#: ../../Structural/Composite/README.rst:37 +msgid "Form.php" +msgstr "Form.php" + +#: ../../Structural/Composite/README.rst:43 +msgid "InputElement.php" +msgstr "InputElement.php" + +#: ../../Structural/Composite/README.rst:49 +msgid "TextElement.php" +msgstr "TextElement.php" + +#: ../../Structural/Composite/README.rst:56 +msgid "Test" +msgstr "Тест" + +#: ../../Structural/Composite/README.rst:58 +msgid "Tests/CompositeTest.php" +msgstr "Tests/CompositeTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/DataMapper/README.po b/locale/de/LC_MESSAGES/Structural/DataMapper/README.po new file mode 100644 index 0000000..ce871bb --- /dev/null +++ b/locale/de/LC_MESSAGES/Structural/DataMapper/README.po @@ -0,0 +1,94 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-06-02 00:48+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Structural/DataMapper/README.rst:2 +msgid "`Data Mapper`__" +msgstr "Преобразователь Данных (`Data Mapper`__)" + +#: ../../Structural/DataMapper/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Structural/DataMapper/README.rst:7 +msgid "" +"A Data Mapper, is a Data Access Layer that performs bidirectional transfer " +"of data between a persistent data store (often a relational database) and an" +" in memory data representation (the domain layer). The goal of the pattern " +"is to keep the in memory representation and the persistent data store " +"independent of each other and the data mapper itself. The layer is composed " +"of one or more mappers (or Data Access Objects), performing the data " +"transfer. Mapper implementations vary in scope. Generic mappers will handle " +"many different domain entity types, dedicated mappers will handle one or a " +"few." +msgstr "" +"Преобразователь Данных — это паттерн, который выступает в роли посредника " +"для двунаправленной передачи данных между постоянным хранилищем данных " +"(часто, реляционной базы данных) и представления данных в памяти (слой " +"домена, то что уже загружено и используется для логической обработки). Цель " +"паттерна в том, чтобы держать представление данных в памяти и постоянное " +"хранилище данных независимыми друг от друга и от самого преобразователя " +"данных. Слой состоит из одного или более mapper-а (или объектов доступа к " +"данным), отвечающих за передачу данных. Реализации mapper-ов различаются по " +"назначению. Общие mapper-ы могут обрабатывать всевозоможные типы сущностей " +"доменов, а выделенные mapper-ы будет обрабатывать один или несколько " +"конкретных типов." + +#: ../../Structural/DataMapper/README.rst:17 +msgid "" +"The key point of this pattern is, unlike Active Record pattern, the data " +"model follows Single Responsibility Principle." +msgstr "" +"Ключевым моментом этого паттерна, в отличие от Активной Записи (Active " +"Records) является то, что модель данных следует `Принципу Единой " +"Обязанности `_ SOLID." + +#: ../../Structural/DataMapper/README.rst:21 +msgid "Examples" +msgstr "Примеры" + +#: ../../Structural/DataMapper/README.rst:23 +msgid "" +"DB Object Relational Mapper (ORM) : Doctrine2 uses DAO named as " +"\"EntityRepository\"" +msgstr "" +"DB Object Relational Mapper (ORM) : Doctrine2 использует DAO под названием " +"\"EntityRepository\"" + +#: ../../Structural/DataMapper/README.rst:27 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Structural/DataMapper/README.rst:34 +msgid "Code" +msgstr "Код" + +#: ../../Structural/DataMapper/README.rst:36 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Structural/DataMapper/README.rst:38 +msgid "User.php" +msgstr "User.php" + +#: ../../Structural/DataMapper/README.rst:44 +msgid "UserMapper.php" +msgstr "UserMapper.php" + +#: ../../Structural/DataMapper/README.rst:51 +msgid "Test" +msgstr "Тест" + +#: ../../Structural/DataMapper/README.rst:53 +msgid "Tests/DataMapperTest.php" +msgstr "Tests/DataMapperTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/Decorator/README.po b/locale/de/LC_MESSAGES/Structural/Decorator/README.po new file mode 100644 index 0000000..c3fe618 --- /dev/null +++ b/locale/de/LC_MESSAGES/Structural/Decorator/README.po @@ -0,0 +1,82 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-06-02 00:53+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Structural/Decorator/README.rst:2 +msgid "`Decorator`__" +msgstr "" +"`Декоратор `_ (`Decorator`__)" + +#: ../../Structural/Decorator/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Structural/Decorator/README.rst:7 +msgid "To dynamically add new functionality to class instances." +msgstr "Динамически добавляет новую функциональность в экземпляры классов." + +#: ../../Structural/Decorator/README.rst:10 +msgid "Examples" +msgstr "Примеры" + +#: ../../Structural/Decorator/README.rst:12 +msgid "Zend Framework: decorators for ``Zend_Form_Element`` instances" +msgstr "Zend Framework: декораторы для экземпляров ``Zend_Form_Element``" + +#: ../../Structural/Decorator/README.rst:13 +msgid "" +"Web Service Layer: Decorators JSON and XML for a REST service (in this case," +" only one of these should be allowed of course)" +msgstr "" +"Web Service Layer: Декораторы JSON и XML для REST сервисов (в этом случае, " +"конечно, только один из них может быть разрешен)." + +#: ../../Structural/Decorator/README.rst:17 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Structural/Decorator/README.rst:24 +msgid "Code" +msgstr "Код" + +#: ../../Structural/Decorator/README.rst:26 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Structural/Decorator/README.rst:28 +msgid "RendererInterface.php" +msgstr "RendererInterface.php" + +#: ../../Structural/Decorator/README.rst:34 +msgid "Webservice.php" +msgstr "Webservice.php" + +#: ../../Structural/Decorator/README.rst:40 +msgid "Decorator.php" +msgstr "Decorator.php" + +#: ../../Structural/Decorator/README.rst:46 +msgid "RenderInXml.php" +msgstr "RenderInXml.php" + +#: ../../Structural/Decorator/README.rst:52 +msgid "RenderInJson.php" +msgstr "RenderInJson.php" + +#: ../../Structural/Decorator/README.rst:59 +msgid "Test" +msgstr "Тест" + +#: ../../Structural/Decorator/README.rst:61 +msgid "Tests/DecoratorTest.php" +msgstr "Tests/DecoratorTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/DependencyInjection/README.po b/locale/de/LC_MESSAGES/Structural/DependencyInjection/README.po new file mode 100644 index 0000000..8ff2098 --- /dev/null +++ b/locale/de/LC_MESSAGES/Structural/DependencyInjection/README.po @@ -0,0 +1,130 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-06-02 01:32+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Structural/DependencyInjection/README.rst:2 +msgid "`Dependency Injection`__" +msgstr "" +"`Внедрение Зависимости `_ (`Dependency Injection`__)" + +#: ../../Structural/DependencyInjection/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Structural/DependencyInjection/README.rst:7 +msgid "" +"To implement a loosely coupled architecture in order to get better testable," +" maintainable and extendable code." +msgstr "" +"Для реализации слабосвязанной архитектуры. Чтобы получить более " +"тестируемый, сопровождаемый и расширяемый код." + +#: ../../Structural/DependencyInjection/README.rst:11 +msgid "Usage" +msgstr "Использование" + +#: ../../Structural/DependencyInjection/README.rst:13 +msgid "" +"Configuration gets injected and ``Connection`` will get all that it needs " +"from ``$config``. Without DI, the configuration would be created directly in" +" ``Connection``, which is not very good for testing and extending " +"``Connection``." +msgstr "" +"Объект Configuration внедряется в ``Connection`` и последний получает всё, " +"что ему необходимо из переменной ``$ config``. Без DI, конфигурация будет " +"создана непосредственно в ``Connection``, что не очень хорошо для " +"тестирования и расширения ``Connection``, так как связывает эти классы " +"напрямую." + +#: ../../Structural/DependencyInjection/README.rst:18 +msgid "" +"Notice we are following Inversion of control principle in ``Connection`` by " +"asking ``$config`` to implement ``Parameters`` interface. This decouples our" +" components. We don't care where the source of information comes from, we " +"only care that ``$config`` has certain methods to retrieve that information." +" Read more about Inversion of control `here " +"`__." +msgstr "" +"Обратите внимание, в ``Connection`` мы следуем принципу SOLID `Инверсия " +"Управления `_, " +"запрашивая параметр ``$config``, чтобы реализовать интерфейс " +"``Parameters``. Это отделяет наши компоненты друг от друга. Нас не заботит, " +"из какого источника поступает эта информация о конфигурации, мы заботимся " +"только о том, что ``$config`` должен иметь определенные методы, чтобы мы " +"могли получить эту информацию." + +#: ../../Structural/DependencyInjection/README.rst:26 +msgid "Examples" +msgstr "Примеры" + +#: ../../Structural/DependencyInjection/README.rst:28 +msgid "" +"The Doctrine2 ORM uses dependency injection e.g. for configuration that is " +"injected into a ``Connection`` object. For testing purposes, one can easily " +"create a mock object of the configuration and inject that into the " +"``Connection`` object" +msgstr "" +"The Doctrine2 ORM использует Внедрение Зависимости например для " +"конфигурации, которая внедряется в объект ``Connection``. Для целей " +"тестирования, можно легко создать макет объекта конфигурации и внедрить его " +"в объект ``Connection``, подменив оригинальный." + +#: ../../Structural/DependencyInjection/README.rst:32 +msgid "" +"Symfony and Zend Framework 2 already have containers for DI that create " +"objects via a configuration array and inject them where needed (i.e. in " +"Controllers)" +msgstr "" +"Symfony and Zend Framework 2 уже содержат контейнеры для DI, которые " +"создают объекты с помощью массива из конфигурации, и внедряют их в случае " +"необходимости (т.е. в Контроллерах)." + +#: ../../Structural/DependencyInjection/README.rst:37 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Structural/DependencyInjection/README.rst:44 +msgid "Code" +msgstr "Код" + +#: ../../Structural/DependencyInjection/README.rst:46 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Structural/DependencyInjection/README.rst:48 +msgid "AbstractConfig.php" +msgstr "AbstractConfig.php" + +#: ../../Structural/DependencyInjection/README.rst:54 +msgid "Parameters.php" +msgstr "Parameters.php" + +#: ../../Structural/DependencyInjection/README.rst:60 +msgid "ArrayConfig.php" +msgstr "ArrayConfig.php" + +#: ../../Structural/DependencyInjection/README.rst:66 +msgid "Connection.php" +msgstr "Connection.php" + +#: ../../Structural/DependencyInjection/README.rst:73 +msgid "Test" +msgstr "Тест" + +#: ../../Structural/DependencyInjection/README.rst:75 +msgid "Tests/DependencyInjectionTest.php" +msgstr "Tests/DependencyInjectionTest.php" + +#: ../../Structural/DependencyInjection/README.rst:81 +msgid "Tests/config.php" +msgstr "Tests/config.php" diff --git a/locale/de/LC_MESSAGES/Structural/Facade/README.po b/locale/de/LC_MESSAGES/Structural/Facade/README.po new file mode 100644 index 0000000..f4f4186 --- /dev/null +++ b/locale/de/LC_MESSAGES/Structural/Facade/README.po @@ -0,0 +1,106 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-06-02 01:48+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Structural/Facade/README.rst:2 +msgid "`Facade`__" +msgstr "" +"`Фасад `_ " +"(`Facade`__)" + +#: ../../Structural/Facade/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Structural/Facade/README.rst:7 +msgid "" +"The primary goal of a Facade Pattern is not to avoid you to read the manual " +"of a complex API. It's only a side-effect. The first goal is to reduce " +"coupling and follow the Law of Demeter." +msgstr "" +"Основная цель паттерна Фасад заключается не в том, чтобы помешать вам " +"прочитать инструкцию комплексной API. Это только побочный эффект. Главная " +"цель всё же состоит в уменьшении связности кода и соблюдении `Закона " +"Деметры `_." + +#: ../../Structural/Facade/README.rst:11 +msgid "" +"A Facade is meant to decouple a client and a sub-system by embedding many " +"(but sometimes just one) interface, and of course to reduce complexity." +msgstr "" +"Фасад предназначен для разделения клиента и подсистемы путем внедрения " +"многих (но иногда только одного) интерфейсов, и, конечно, уменьшения общей " +"сложности." + +#: ../../Structural/Facade/README.rst:15 +msgid "A facade does not forbid you the access to the sub-system" +msgstr "" +"Фасад не запрещает прямой доступ к подсистеме. Просто он делает его проще и " +"понятнее." + +#: ../../Structural/Facade/README.rst:16 +msgid "You can (you should) have multiple facades for one sub-system" +msgstr "" +"Вы можете (и вам стоило бы) иметь несколько фасадов для одной подсистемы." + +#: ../../Structural/Facade/README.rst:18 +msgid "" +"That's why a good facade has no ``new`` in it. If there are multiple " +"creations for each method, it is not a Facade, it's a Builder or a " +"[Abstract\\|Static\\|Simple] Factory [Method]." +msgstr "" +"Вот почему хороший фасад не содержит созданий экземпляров классов (``new``) " +"внутри. Если внутри фасада создаются объекты для реализации каждого метода, " +"это не Фасад, это Строитель или [Абстрактная\\|Статическая\\|Простая] " +"Фабрика [или Фабричный Метод]." + +#: ../../Structural/Facade/README.rst:22 +msgid "" +"The best facade has no ``new`` and a constructor with interface-type-hinted " +"parameters. If you need creation of new instances, use a Factory as " +"argument." +msgstr "" +"Лучший фасад не содержит ``new`` или конструктора с type-hinted " +"параметрами. Если вам необходимо создавать новые экземпляры классов, в " +"таком случае лучше использовать Фабрику в качестве аргумента." + +#: ../../Structural/Facade/README.rst:27 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Structural/Facade/README.rst:34 +msgid "Code" +msgstr "Код" + +#: ../../Structural/Facade/README.rst:36 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Structural/Facade/README.rst:38 +msgid "Facade.php" +msgstr "Facade.php" + +#: ../../Structural/Facade/README.rst:44 +msgid "OsInterface.php" +msgstr "OsInterface.php" + +#: ../../Structural/Facade/README.rst:50 +msgid "BiosInterface.php" +msgstr "BiosInterface.php" + +#: ../../Structural/Facade/README.rst:57 +msgid "Test" +msgstr "Тест" + +#: ../../Structural/Facade/README.rst:59 +msgid "Tests/FacadeTest.php" +msgstr "Tests/FacadeTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/FluentInterface/README.po b/locale/de/LC_MESSAGES/Structural/FluentInterface/README.po new file mode 100644 index 0000000..ad460da --- /dev/null +++ b/locale/de/LC_MESSAGES/Structural/FluentInterface/README.po @@ -0,0 +1,72 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-06-02 01:50+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Structural/FluentInterface/README.rst:2 +msgid "`Fluent Interface`__" +msgstr "" +"`Текучий Интерфейс `_ " +"(`Fluent Interface`__)" + +#: ../../Structural/FluentInterface/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Structural/FluentInterface/README.rst:7 +msgid "" +"To write code that is easy readable just like sentences in a natural " +"language (like English)." +msgstr "" +"Писать код, который легко читается, как предложения в естественном языке " +"(вроде русского или английского)." + +#: ../../Structural/FluentInterface/README.rst:11 +msgid "Examples" +msgstr "Примеры" + +#: ../../Structural/FluentInterface/README.rst:13 +msgid "Doctrine2's QueryBuilder works something like that example class below" +msgstr "Doctrine2’s QueryBuilder работает примерно также, как пример ниже." + +#: ../../Structural/FluentInterface/README.rst:15 +msgid "PHPUnit uses fluent interfaces to build mock objects" +msgstr "" +"PHPUnit использует текучий интерфейс, чтобы создавать макеты объектов." + +#: ../../Structural/FluentInterface/README.rst:16 +msgid "Yii Framework: CDbCommand and CActiveRecord use this pattern, too" +msgstr "" +"Yii Framework: CDbCommand и CActiveRecord тоже используют этот паттерн." + +#: ../../Structural/FluentInterface/README.rst:19 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Structural/FluentInterface/README.rst:26 +msgid "Code" +msgstr "Код" + +#: ../../Structural/FluentInterface/README.rst:28 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Structural/FluentInterface/README.rst:30 +msgid "Sql.php" +msgstr "Sql.php" + +#: ../../Structural/FluentInterface/README.rst:37 +msgid "Test" +msgstr "Тест" + +#: ../../Structural/FluentInterface/README.rst:39 +msgid "Tests/FluentInterfaceTest.php" +msgstr "Tests/FluentInterfaceTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/Proxy/README.po b/locale/de/LC_MESSAGES/Structural/Proxy/README.po new file mode 100644 index 0000000..a708a66 --- /dev/null +++ b/locale/de/LC_MESSAGES/Structural/Proxy/README.po @@ -0,0 +1,66 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-06-02 01:56+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Structural/Proxy/README.rst:2 +msgid "`Proxy`__" +msgstr "" +"`Прокси `_ " +"(`Proxy`__)" + +#: ../../Structural/Proxy/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Structural/Proxy/README.rst:7 +msgid "To interface to anything that is expensive or impossible to duplicate." +msgstr "" +"Создать интерфейс взаимодействия с любым классом, который трудно или " +"невозможно использовать в оригинальном виде." + +#: ../../Structural/Proxy/README.rst:10 +msgid "Examples" +msgstr "Примеры" + +#: ../../Structural/Proxy/README.rst:12 +msgid "" +"Doctrine2 uses proxies to implement framework magic (e.g. lazy " +"initialization) in them, while the user still works with his own entity " +"classes and will never use nor touch the proxies" +msgstr "" +"Doctrine2 использует прокси для реализации магии фреймворка (например, для " +"ленивой инициализации), в то время как пользователь работает со своими " +"собственными классами сущностей и никогда не будет использовать прокси." + +#: ../../Structural/Proxy/README.rst:17 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Structural/Proxy/README.rst:24 +msgid "Code" +msgstr "Код" + +#: ../../Structural/Proxy/README.rst:26 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Structural/Proxy/README.rst:28 +msgid "Record.php" +msgstr "Record.php" + +#: ../../Structural/Proxy/README.rst:34 +msgid "RecordProxy.php" +msgstr "RecordProxy.php" + +#: ../../Structural/Proxy/README.rst:41 +msgid "Test" +msgstr "Тест" diff --git a/locale/de/LC_MESSAGES/Structural/README.po b/locale/de/LC_MESSAGES/Structural/README.po new file mode 100644 index 0000000..3ecfece --- /dev/null +++ b/locale/de/LC_MESSAGES/Structural/README.po @@ -0,0 +1,28 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-05-30 23:27+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Structural/README.rst:2 +msgid "`Structural`__" +msgstr "" +"`Структурные шаблоны проектирования `_ (`Structural`__)" + +#: ../../Structural/README.rst:4 +msgid "" +"In Software Engineering, Structural Design Patterns are Design Patterns that" +" ease the design by identifying a simple way to realize relationships " +"between entities." +msgstr "" +"При разработке программного обеспечения, Структурные шаблоны проектирования " +"упрощают проектирование путем выявления простого способа реализовать " +"отношения между субъектами." diff --git a/locale/de/LC_MESSAGES/Structural/Registry/README.po b/locale/de/LC_MESSAGES/Structural/Registry/README.po new file mode 100644 index 0000000..92e2d6e --- /dev/null +++ b/locale/de/LC_MESSAGES/Structural/Registry/README.po @@ -0,0 +1,74 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"PO-Revision-Date: 2015-06-02 01:36+0300\n" +"Last-Translator: Dominik Liebler \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" + +#: ../../Structural/Registry/README.rst:2 +msgid "`Registry`__" +msgstr "Реестр (Registry)" + +#: ../../Structural/Registry/README.rst:5 +msgid "Purpose" +msgstr "Назначение" + +#: ../../Structural/Registry/README.rst:7 +msgid "" +"To implement a central storage for objects often used throughout the " +"application, is typically implemented using an abstract class with only " +"static methods (or using the Singleton pattern)" +msgstr "" +"Для реализации централизованного хранения объектов, часто используемых " +"во всем приложении, как правило, реализуется с помощью абстрактного " +"класса с только статическими методами (или с помощью шаблона Singleton)." + +#: ../../Structural/Registry/README.rst:12 +msgid "Examples" +msgstr "Примеры" + +#: ../../Structural/Registry/README.rst:14 +msgid "" +"Zend Framework: ``Zend_Registry`` holds the application's logger object, " +"front controller etc." +msgstr "" +"Zend Framework: ``Zend_Registry`` содержит объект журналирования " +"приложения (логгер), фронт-контроллер и т.д." + +#: ../../Structural/Registry/README.rst:16 +msgid "" +"Yii Framework: ``CWebApplication`` holds all the application components, " +"such as ``CWebUser``, ``CUrlManager``, etc." +msgstr "" +"Yii Framework: ``CWebApplication`` содержит все компоненты приложения, " +"такие как ``CWebUser``, ``CUrlManager``, и т.д." + +#: ../../Structural/Registry/README.rst:20 +msgid "UML Diagram" +msgstr "UML Диаграмма" + +#: ../../Structural/Registry/README.rst:27 +msgid "Code" +msgstr "Код" + +#: ../../Structural/Registry/README.rst:29 +msgid "You can also find these code on `GitHub`_" +msgstr "Вы можете найти этот код на `GitHub`_" + +#: ../../Structural/Registry/README.rst:31 +msgid "Registry.php" +msgstr "Registry.php" + +#: ../../Structural/Registry/README.rst:38 +msgid "Test" +msgstr "Тест" + +#: ../../Structural/Registry/README.rst:40 +msgid "Tests/RegistryTest.php" +msgstr "Tests/RegistryTest.php" From 1d63e8544baf044170e6e9133249bb4b29e5c93f Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Mon, 4 Apr 2016 08:03:45 +0200 Subject: [PATCH 013/148] translated Structural patterns --- .../LC_MESSAGES/Structural/Adapter/README.po | 42 +++++----- .../LC_MESSAGES/Structural/Bridge/README.po | 24 +++--- .../Structural/Composite/README.po | 35 ++++----- .../Structural/DataMapper/README.po | 60 +++++++-------- .../Structural/Decorator/README.po | 32 ++++---- .../Structural/DependencyInjection/README.po | 76 +++++++++---------- .../LC_MESSAGES/Structural/Facade/README.po | 54 ++++++------- .../Structural/FluentInterface/README.po | 32 ++++---- .../de/LC_MESSAGES/Structural/Proxy/README.po | 30 ++++---- locale/de/LC_MESSAGES/Structural/README.po | 18 ++--- .../LC_MESSAGES/Structural/Registry/README.po | 33 ++++---- 11 files changed, 216 insertions(+), 220 deletions(-) diff --git a/locale/de/LC_MESSAGES/Structural/Adapter/README.po b/locale/de/LC_MESSAGES/Structural/Adapter/README.po index b56001b..4dfe1b9 100644 --- a/locale/de/LC_MESSAGES/Structural/Adapter/README.po +++ b/locale/de/LC_MESSAGES/Structural/Adapter/README.po @@ -4,22 +4,22 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-31 14:58+0300\n" +"PO-Revision-Date: 2016-04-04 07:27+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Structural/Adapter/README.rst:2 msgid "`Adapter / Wrapper`__" -msgstr "" -"`Адаптер `_ " -"(`Adapter / Wrapper`__)" +msgstr "`Adapter / Wrapper`__" #: ../../Structural/Adapter/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Structural/Adapter/README.rst:7 msgid "" @@ -28,40 +28,40 @@ msgid "" "incompatible interfaces by providing it's interface to clients while using " "the original interface." msgstr "" -"Привести нестандартный или неудобный интерфейс какого-то класса в " -"интерфейс, совместимый с вашим кодом. Адаптер позволяет классам работать " -"вместе стандартным образом, что обычно не получается из-за несовместимых " -"интерфейсов, предоставляя для этого прослойку с интерфейсом, удобным для " -"клиентов, самостоятельно используя оригинальный интерфейс." +"Um ein Interface für eine Klasse in ein kompatibles Interface zu " +"übersetzen. Ein Adapter erlaubt Klassen miteinander zu arbeiten die " +"normalerweise aufgrund von inkompatiblen Interfaces nicht miteinander " +"arbeiten könnten, indem ein Interface für die originalen Klassen zur " +"Verfügung gestellt wird." #: ../../Structural/Adapter/README.rst:13 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../Structural/Adapter/README.rst:15 msgid "DB Client libraries adapter" -msgstr "Адаптер клиентских библиотек для работы с базами данных" +msgstr "Datenbank-Adapter" #: ../../Structural/Adapter/README.rst:16 msgid "" -"using multiple different webservices and adapters normalize data so that the" -" outcome is the same for all" +"using multiple different webservices and adapters normalize data so that " +"the outcome is the same for all" msgstr "" -"нормализовать данные нескольких различных веб-сервисов, в одинаковую " -"структуру, как будто вы работаете со стандартным сервисом (например при " -"работе с API соцсетей)" +"verschiedene Webservices zu verwenden, bei denen mit Hilfe eines Adapters " +"für jeden die Daten aufbereitet werden, so dass nach außen dasselbe " +"Ergebnis zu erwarten ist" #: ../../Structural/Adapter/README.rst:20 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Structural/Adapter/README.rst:27 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Structural/Adapter/README.rst:29 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Structural/Adapter/README.rst:31 msgid "PaperBookInterface.php" @@ -85,7 +85,7 @@ msgstr "Kindle.php" #: ../../Structural/Adapter/README.rst:62 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Structural/Adapter/README.rst:64 msgid "Tests/AdapterTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/Bridge/README.po b/locale/de/LC_MESSAGES/Structural/Bridge/README.po index 9e7356e..14bd48c 100644 --- a/locale/de/LC_MESSAGES/Structural/Bridge/README.po +++ b/locale/de/LC_MESSAGES/Structural/Bridge/README.po @@ -4,34 +4,34 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-06-02 00:24+0300\n" +"PO-Revision-Date: 2016-04-04 07:28+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Structural/Bridge/README.rst:2 msgid "`Bridge`__" -msgstr "" -"`Мост `_ " -"(`Bridge`__)" +msgstr "`Bridge`__" #: ../../Structural/Bridge/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Structural/Bridge/README.rst:7 msgid "" "Decouple an abstraction from its implementation so that the two can vary " "independently." msgstr "" -"Отделить абстракцию от её реализации так, что они могут изменяться " -"независимо друг от друга." +"Eine Abstraktion von seiner Implementierung zu entkoppeln, sodass sich " +"diese unterscheiden können." #: ../../Structural/Bridge/README.rst:11 msgid "Sample:" -msgstr "Пример:" +msgstr "Beispiel:" #: ../../Structural/Bridge/README.rst:13 msgid "`Symfony DoctrineBridge `__" @@ -40,15 +40,15 @@ msgstr "" #: ../../Structural/Bridge/README.rst:17 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Structural/Bridge/README.rst:24 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Structural/Bridge/README.rst:26 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Structural/Bridge/README.rst:28 msgid "Workshop.php" @@ -76,7 +76,7 @@ msgstr "Car.php" #: ../../Structural/Bridge/README.rst:65 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Structural/Bridge/README.rst:67 msgid "Tests/BridgeTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/Composite/README.po b/locale/de/LC_MESSAGES/Structural/Composite/README.po index 70c622b..e9e55bd 100644 --- a/locale/de/LC_MESSAGES/Structural/Composite/README.po +++ b/locale/de/LC_MESSAGES/Structural/Composite/README.po @@ -4,33 +4,33 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-06-02 00:33+0300\n" +"PO-Revision-Date: 2016-04-04 07:31+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Structural/Composite/README.rst:2 msgid "`Composite`__" -msgstr "" -"`Компоновщик `_ (`Composite`__)" +msgstr "`Composite`__" #: ../../Structural/Composite/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Structural/Composite/README.rst:7 msgid "" "To treat a group of objects the same way as a single instance of the object." msgstr "" -"Взаимодействие с иерархической группой объектов также, как и с отдельно " -"взятым экземпляром." +"Eine Gruppe von Objekten genauso zu behandeln wie eine einzelne Instanz " +"eines Objekts." #: ../../Structural/Composite/README.rst:11 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../Structural/Composite/README.rst:13 msgid "" @@ -38,29 +38,30 @@ msgid "" "of the form, when ``render()`` is called, it subsequently runs through all " "its child elements and calls ``render()`` on them" msgstr "" -"Экземпляр класса Form обрабатывает все свои элементы формы, как будто это " -"один экземпляр. И когда вызывается метод ``render()``, он перебирает все " -"дочерние элементы и вызывает их собственный ``render()``." +"Eine Formular-Klasseninstanz behandelt alle seine beinhalteten Formelemente " +"wie eine eine einzelne Instanz des Formulars. Wenn ``render()`` aufgerufen " +"wird, werden alle Kindelemente durchlaufen und auf jedem wieder " +"``render()`` aufgerufen." #: ../../Structural/Composite/README.rst:16 msgid "" "``Zend_Config``: a tree of configuration options, each one is a " "``Zend_Config`` object itself" msgstr "" -"``Zend_Config``: дерево вариантов конфигурации, где каждая из конфигураций " -"тоже представляет собой объект ``Zend_Config``" +"``Zend_Config``: ein Baum aus Konfigurationsoptionen, bei dem jedes Objekt " +"wieder eine Instanz von``Zend_Config`` ist" #: ../../Structural/Composite/README.rst:20 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Structural/Composite/README.rst:27 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Structural/Composite/README.rst:29 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Structural/Composite/README.rst:31 msgid "FormElement.php" @@ -80,7 +81,7 @@ msgstr "TextElement.php" #: ../../Structural/Composite/README.rst:56 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Structural/Composite/README.rst:58 msgid "Tests/CompositeTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/DataMapper/README.po b/locale/de/LC_MESSAGES/Structural/DataMapper/README.po index ce871bb..b563d43 100644 --- a/locale/de/LC_MESSAGES/Structural/DataMapper/README.po +++ b/locale/de/LC_MESSAGES/Structural/DataMapper/README.po @@ -4,58 +4,56 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-06-02 00:48+0300\n" +"PO-Revision-Date: 2016-04-04 07:37+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Structural/DataMapper/README.rst:2 msgid "`Data Mapper`__" -msgstr "Преобразователь Данных (`Data Mapper`__)" +msgstr "`Data Mapper`__" #: ../../Structural/DataMapper/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Structural/DataMapper/README.rst:7 msgid "" "A Data Mapper, is a Data Access Layer that performs bidirectional transfer " -"of data between a persistent data store (often a relational database) and an" -" in memory data representation (the domain layer). The goal of the pattern " -"is to keep the in memory representation and the persistent data store " -"independent of each other and the data mapper itself. The layer is composed " -"of one or more mappers (or Data Access Objects), performing the data " -"transfer. Mapper implementations vary in scope. Generic mappers will handle " -"many different domain entity types, dedicated mappers will handle one or a " -"few." +"of data between a persistent data store (often a relational database) and " +"an in memory data representation (the domain layer). The goal of the " +"pattern is to keep the in memory representation and the persistent data " +"store independent of each other and the data mapper itself. The layer is " +"composed of one or more mappers (or Data Access Objects), performing the " +"data transfer. Mapper implementations vary in scope. Generic mappers will " +"handle many different domain entity types, dedicated mappers will handle " +"one or a few." msgstr "" -"Преобразователь Данных — это паттерн, который выступает в роли посредника " -"для двунаправленной передачи данных между постоянным хранилищем данных " -"(часто, реляционной базы данных) и представления данных в памяти (слой " -"домена, то что уже загружено и используется для логической обработки). Цель " -"паттерна в том, чтобы держать представление данных в памяти и постоянное " -"хранилище данных независимыми друг от друга и от самого преобразователя " -"данных. Слой состоит из одного или более mapper-а (или объектов доступа к " -"данным), отвечающих за передачу данных. Реализации mapper-ов различаются по " -"назначению. Общие mapper-ы могут обрабатывать всевозоможные типы сущностей " -"доменов, а выделенные mapper-ы будет обрабатывать один или несколько " -"конкретных типов." +"Ein Data Mapper ist Teil der Datenzugriffsschicht (Data Access Layer), die " +"für den bidirektionalen Zugriff auf Daten aus einem persistenten Speicher " +"(oftmals eine relationale Datenbank) in den Domain Layer der Anwendung und " +"zurück zuständig ist. Das Ziel dieses Patterns ist es, die jeweiligen Layer " +"zu trennen und unabhängig voneinander zu gestalten. Der Layer besteht aus " +"einem oder mehreren Mappern (oder Data Access Objects), die den Austasch " +"von Daten regeln. Mapper können dabei unterschiedlich komplex aufgebaut " +"sein. Generische Mapper werden viele verschiedene Domain Entity Typen " +"verarbeiten können, aber auch spezialisierte Mapper sind denkbar." #: ../../Structural/DataMapper/README.rst:17 msgid "" "The key point of this pattern is, unlike Active Record pattern, the data " "model follows Single Responsibility Principle." msgstr "" -"Ключевым моментом этого паттерна, в отличие от Активной Записи (Active " -"Records) является то, что модель данных следует `Принципу Единой " -"Обязанности `_ SOLID." +"Im Gegensatz zum Active Record Pattern folgt dieses Muster dem Single " +"Responsibility Prinzip." #: ../../Structural/DataMapper/README.rst:21 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../Structural/DataMapper/README.rst:23 msgid "" @@ -67,15 +65,15 @@ msgstr "" #: ../../Structural/DataMapper/README.rst:27 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Structural/DataMapper/README.rst:34 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Structural/DataMapper/README.rst:36 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Structural/DataMapper/README.rst:38 msgid "User.php" @@ -87,7 +85,7 @@ msgstr "UserMapper.php" #: ../../Structural/DataMapper/README.rst:51 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Structural/DataMapper/README.rst:53 msgid "Tests/DataMapperTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/Decorator/README.po b/locale/de/LC_MESSAGES/Structural/Decorator/README.po index c3fe618..8b12f0c 100644 --- a/locale/de/LC_MESSAGES/Structural/Decorator/README.po +++ b/locale/de/LC_MESSAGES/Structural/Decorator/README.po @@ -4,54 +4,52 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-06-02 00:53+0300\n" +"PO-Revision-Date: 2016-04-04 07:42+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Structural/Decorator/README.rst:2 msgid "`Decorator`__" -msgstr "" -"`Декоратор `_ (`Decorator`__)" +msgstr "`Decorator`__" #: ../../Structural/Decorator/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Structural/Decorator/README.rst:7 msgid "To dynamically add new functionality to class instances." -msgstr "Динамически добавляет новую функциональность в экземпляры классов." +msgstr "neue Funktionalität dynamisch zu Klasseninstanzen hinzuzufügen." #: ../../Structural/Decorator/README.rst:10 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../Structural/Decorator/README.rst:12 msgid "Zend Framework: decorators for ``Zend_Form_Element`` instances" -msgstr "Zend Framework: декораторы для экземпляров ``Zend_Form_Element``" +msgstr "Zend Framework: Dekoratoren für ``Zend_Form_Element`` Instanzen" #: ../../Structural/Decorator/README.rst:13 msgid "" -"Web Service Layer: Decorators JSON and XML for a REST service (in this case," -" only one of these should be allowed of course)" -msgstr "" -"Web Service Layer: Декораторы JSON и XML для REST сервисов (в этом случае, " -"конечно, только один из них может быть разрешен)." +"Web Service Layer: Decorators JSON and XML for a REST service (in this " +"case, only one of these should be allowed of course)" +msgstr "Web Service Layer: JSON- und XML-Dekoratoren für einen REST Service" #: ../../Structural/Decorator/README.rst:17 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Structural/Decorator/README.rst:24 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Structural/Decorator/README.rst:26 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Structural/Decorator/README.rst:28 msgid "RendererInterface.php" @@ -75,7 +73,7 @@ msgstr "RenderInJson.php" #: ../../Structural/Decorator/README.rst:59 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Structural/Decorator/README.rst:61 msgid "Tests/DecoratorTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/DependencyInjection/README.po b/locale/de/LC_MESSAGES/Structural/DependencyInjection/README.po index 8ff2098..4bb372c 100644 --- a/locale/de/LC_MESSAGES/Structural/DependencyInjection/README.po +++ b/locale/de/LC_MESSAGES/Structural/DependencyInjection/README.po @@ -4,12 +4,14 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-06-02 01:32+0300\n" +"PO-Revision-Date: 2016-04-04 07:49+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Structural/DependencyInjection/README.rst:2 msgid "`Dependency Injection`__" @@ -19,53 +21,52 @@ msgstr "" #: ../../Structural/DependencyInjection/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Structural/DependencyInjection/README.rst:7 msgid "" -"To implement a loosely coupled architecture in order to get better testable," -" maintainable and extendable code." +"To implement a loosely coupled architecture in order to get better " +"testable, maintainable and extendable code." msgstr "" -"Для реализации слабосвязанной архитектуры. Чтобы получить более " -"тестируемый, сопровождаемый и расширяемый код." +"Eine lose gekoppelte Architektur zu implementieren, um besser testbaren, " +"wartbaren und erweiterbaren Code zu erreichen." #: ../../Structural/DependencyInjection/README.rst:11 msgid "Usage" -msgstr "Использование" +msgstr "Verwendung" #: ../../Structural/DependencyInjection/README.rst:13 msgid "" "Configuration gets injected and ``Connection`` will get all that it needs " -"from ``$config``. Without DI, the configuration would be created directly in" -" ``Connection``, which is not very good for testing and extending " +"from ``$config``. Without DI, the configuration would be created directly " +"in ``Connection``, which is not very good for testing and extending " "``Connection``." msgstr "" -"Объект Configuration внедряется в ``Connection`` и последний получает всё, " -"что ему необходимо из переменной ``$ config``. Без DI, конфигурация будет " -"создана непосредственно в ``Connection``, что не очень хорошо для " -"тестирования и расширения ``Connection``, так как связывает эти классы " -"напрямую." +"Die Konfiguration wird injiziert und ``Connection`` wird sich von ``" +"$config`` selbstständig nehmen, was es braucht. Ohne DI würde die " +"Konfiguration direkt in ``Connection`` erzeugt, was sich schlecht testen " +"und erweitern lässt." #: ../../Structural/DependencyInjection/README.rst:18 msgid "" "Notice we are following Inversion of control principle in ``Connection`` by " -"asking ``$config`` to implement ``Parameters`` interface. This decouples our" -" components. We don't care where the source of information comes from, we " -"only care that ``$config`` has certain methods to retrieve that information." -" Read more about Inversion of control `here " -"`__." +"asking ``$config`` to implement ``Parameters`` interface. This decouples " +"our components. We don't care where the source of information comes from, " +"we only care that ``$config`` has certain methods to retrieve that " +"information. Read more about Inversion of control `here `__." msgstr "" -"Обратите внимание, в ``Connection`` мы следуем принципу SOLID `Инверсия " -"Управления `_, " -"запрашивая параметр ``$config``, чтобы реализовать интерфейс " -"``Parameters``. Это отделяет наши компоненты друг от друга. Нас не заботит, " -"из какого источника поступает эта информация о конфигурации, мы заботимся " -"только о том, что ``$config`` должен иметь определенные методы, чтобы мы " -"могли получить эту информацию." +"Beachte, dass wir in ``Connection`` dem Inversion of Control Prinzip " +"folgen, indem wir ``$config`` das ``Parameters`` Interface implementieren " +"lassen. Das entkoppelt unsere Komponenten. Wir interessieren uns auch nicht " +"für die Quelle der benötigten Informationen, alles was an der Stelle " +"wichtig ist, ist, dass ``$config`` bestimmte Methoden zum Auslesen der " +"Informationen bereitstellt. Weiteres zu Inversion of control gibt es`hier " +"`__." #: ../../Structural/DependencyInjection/README.rst:26 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../Structural/DependencyInjection/README.rst:28 msgid "" @@ -74,10 +75,9 @@ msgid "" "create a mock object of the configuration and inject that into the " "``Connection`` object" msgstr "" -"The Doctrine2 ORM использует Внедрение Зависимости например для " -"конфигурации, которая внедряется в объект ``Connection``. Для целей " -"тестирования, можно легко создать макет объекта конфигурации и внедрить его " -"в объект ``Connection``, подменив оригинальный." +"Das Doctrine2 ORM benutzt Dependency Injection für z.B. die Konfiguration, " +"die in ein ``Connection`` injiziert wird. Für Testzwecke lässt sich diese " +"leicht durch ein gemocktes Objekt austauschen." #: ../../Structural/DependencyInjection/README.rst:32 msgid "" @@ -85,21 +85,21 @@ msgid "" "objects via a configuration array and inject them where needed (i.e. in " "Controllers)" msgstr "" -"Symfony and Zend Framework 2 уже содержат контейнеры для DI, которые " -"создают объекты с помощью массива из конфигурации, и внедряют их в случае " -"необходимости (т.е. в Контроллерах)." +"Symfony2 und Zend Framework 2 bieten beide Dependency Injection Container " +"an, die selbstständig vorkonfigurierte Objekte bei Bedarf erzeugen und " +"diese in z.B. Controller injizieren können." #: ../../Structural/DependencyInjection/README.rst:37 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Structural/DependencyInjection/README.rst:44 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Structural/DependencyInjection/README.rst:46 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Structural/DependencyInjection/README.rst:48 msgid "AbstractConfig.php" @@ -119,7 +119,7 @@ msgstr "Connection.php" #: ../../Structural/DependencyInjection/README.rst:73 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Structural/DependencyInjection/README.rst:75 msgid "Tests/DependencyInjectionTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/Facade/README.po b/locale/de/LC_MESSAGES/Structural/Facade/README.po index f4f4186..2e241c1 100644 --- a/locale/de/LC_MESSAGES/Structural/Facade/README.po +++ b/locale/de/LC_MESSAGES/Structural/Facade/README.po @@ -4,22 +4,22 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-06-02 01:48+0300\n" +"PO-Revision-Date: 2016-04-04 07:56+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Structural/Facade/README.rst:2 msgid "`Facade`__" -msgstr "" -"`Фасад `_ " -"(`Facade`__)" +msgstr "`Facade`__" #: ../../Structural/Facade/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Structural/Facade/README.rst:7 msgid "" @@ -27,41 +27,37 @@ msgid "" "of a complex API. It's only a side-effect. The first goal is to reduce " "coupling and follow the Law of Demeter." msgstr "" -"Основная цель паттерна Фасад заключается не в том, чтобы помешать вам " -"прочитать инструкцию комплексной API. Это только побочный эффект. Главная " -"цель всё же состоит в уменьшении связности кода и соблюдении `Закона " -"Деметры `_." +"Das primäre Ziel des Facade-Musters ist nicht, dir das Lesen von komplexen " +"API Dokumentationen zu ersparen. Das kann ein Seiteneffekt sein. Es ist " +"vielmehr das Ziel, Kopplungen zu vermeiden und dem Gesetz von Demeter zu " +"folgen." #: ../../Structural/Facade/README.rst:11 msgid "" "A Facade is meant to decouple a client and a sub-system by embedding many " "(but sometimes just one) interface, and of course to reduce complexity." msgstr "" -"Фасад предназначен для разделения клиента и подсистемы путем внедрения " -"многих (но иногда только одного) интерфейсов, и, конечно, уменьшения общей " -"сложности." +"Eine Facade dient dazu, den Client von einem Subsystem zu entkopplen, indem " +"ein oder mehrere Interfaces einzuführen und damit Komplexität zu verringern." #: ../../Structural/Facade/README.rst:15 msgid "A facade does not forbid you the access to the sub-system" -msgstr "" -"Фасад не запрещает прямой доступ к подсистеме. Просто он делает его проще и " -"понятнее." +msgstr "Eine Facade verbietet nicht den Zugriff auf das Subsystem" #: ../../Structural/Facade/README.rst:16 msgid "You can (you should) have multiple facades for one sub-system" msgstr "" -"Вы можете (и вам стоило бы) иметь несколько фасадов для одной подсистемы." +"Es ist nicht unüblich, mehrere Fassaden für ein Subsystem zu implementieren" #: ../../Structural/Facade/README.rst:18 msgid "" "That's why a good facade has no ``new`` in it. If there are multiple " -"creations for each method, it is not a Facade, it's a Builder or a " -"[Abstract\\|Static\\|Simple] Factory [Method]." +"creations for each method, it is not a Facade, it's a Builder or a [Abstract" +"\\|Static\\|Simple] Factory [Method]." msgstr "" -"Вот почему хороший фасад не содержит созданий экземпляров классов (``new``) " -"внутри. Если внутри фасада создаются объекты для реализации каждого метода, " -"это не Фасад, это Строитель или [Абстрактная\\|Статическая\\|Простая] " -"Фабрика [или Фабричный Метод]." +"Deshalb besitzt eine gute Facade keine ``new`` Aufrufe. Falls es mehrere " +"Erzeugungsmethoden pro Methode gibt, handelt es sicht nicht um eine Facade, " +"sondern um einen Builder oder [Abstract\\|Static\\|Simple] Factory [Method]." #: ../../Structural/Facade/README.rst:22 msgid "" @@ -69,21 +65,21 @@ msgid "" "parameters. If you need creation of new instances, use a Factory as " "argument." msgstr "" -"Лучший фасад не содержит ``new`` или конструктора с type-hinted " -"параметрами. Если вам необходимо создавать новые экземпляры классов, в " -"таком случае лучше использовать Фабрику в качестве аргумента." +"Bestenfalls besitzt eine Facade kein ``new`` und einen Konstruktor mit Type-" +"Hints als Parameter. Falls du neue Instanzen erzeugen willst, kannst du " +"eine Factory als Argument verwenden." #: ../../Structural/Facade/README.rst:27 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Structural/Facade/README.rst:34 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Structural/Facade/README.rst:36 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Structural/Facade/README.rst:38 msgid "Facade.php" @@ -99,7 +95,7 @@ msgstr "BiosInterface.php" #: ../../Structural/Facade/README.rst:57 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Structural/Facade/README.rst:59 msgid "Tests/FacadeTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/FluentInterface/README.po b/locale/de/LC_MESSAGES/Structural/FluentInterface/README.po index ad460da..a213628 100644 --- a/locale/de/LC_MESSAGES/Structural/FluentInterface/README.po +++ b/locale/de/LC_MESSAGES/Structural/FluentInterface/README.po @@ -4,60 +4,60 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-06-02 01:50+0300\n" +"PO-Revision-Date: 2016-04-04 07:57+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Structural/FluentInterface/README.rst:2 msgid "`Fluent Interface`__" -msgstr "" -"`Текучий Интерфейс `_ " -"(`Fluent Interface`__)" +msgstr "`Fluent Interface`__" #: ../../Structural/FluentInterface/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Structural/FluentInterface/README.rst:7 msgid "" "To write code that is easy readable just like sentences in a natural " "language (like English)." msgstr "" -"Писать код, который легко читается, как предложения в естественном языке " -"(вроде русского или английского)." +"Um Code zu schreiben, der wie ein Satz in einer natürlichen Sprache gelesen " +"werden kann (z.B. in Englisch)" #: ../../Structural/FluentInterface/README.rst:11 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../Structural/FluentInterface/README.rst:13 msgid "Doctrine2's QueryBuilder works something like that example class below" -msgstr "Doctrine2’s QueryBuilder работает примерно также, как пример ниже." +msgstr "" +"Doctrine2's QueryBuilder funktioniert ähnlich zu dem Beispiel hier unten" #: ../../Structural/FluentInterface/README.rst:15 msgid "PHPUnit uses fluent interfaces to build mock objects" -msgstr "" -"PHPUnit использует текучий интерфейс, чтобы создавать макеты объектов." +msgstr "PHPUnit verwendet ein Fluent Interface, um Mockobjekte zu erstellen" #: ../../Structural/FluentInterface/README.rst:16 msgid "Yii Framework: CDbCommand and CActiveRecord use this pattern, too" msgstr "" -"Yii Framework: CDbCommand и CActiveRecord тоже используют этот паттерн." +"Yii Framework: CDbCommand und CActiveRecord verwenden auch dieses Muster" #: ../../Structural/FluentInterface/README.rst:19 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Structural/FluentInterface/README.rst:26 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Structural/FluentInterface/README.rst:28 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Structural/FluentInterface/README.rst:30 msgid "Sql.php" @@ -65,7 +65,7 @@ msgstr "Sql.php" #: ../../Structural/FluentInterface/README.rst:37 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Structural/FluentInterface/README.rst:39 msgid "Tests/FluentInterfaceTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/Proxy/README.po b/locale/de/LC_MESSAGES/Structural/Proxy/README.po index a708a66..46755ec 100644 --- a/locale/de/LC_MESSAGES/Structural/Proxy/README.po +++ b/locale/de/LC_MESSAGES/Structural/Proxy/README.po @@ -4,32 +4,32 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-06-02 01:56+0300\n" +"PO-Revision-Date: 2016-04-04 07:59+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Structural/Proxy/README.rst:2 msgid "`Proxy`__" -msgstr "" -"`Прокси `_ " -"(`Proxy`__)" +msgstr "`Proxy`__" #: ../../Structural/Proxy/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Structural/Proxy/README.rst:7 msgid "To interface to anything that is expensive or impossible to duplicate." msgstr "" -"Создать интерфейс взаимодействия с любым классом, который трудно или " -"невозможно использовать в оригинальном виде." +"Um ein Interface bereitzustellen, das teuer oder unmöglich zu duplizieren " +"ist" #: ../../Structural/Proxy/README.rst:10 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../Structural/Proxy/README.rst:12 msgid "" @@ -37,21 +37,21 @@ msgid "" "initialization) in them, while the user still works with his own entity " "classes and will never use nor touch the proxies" msgstr "" -"Doctrine2 использует прокси для реализации магии фреймворка (например, для " -"ленивой инициализации), в то время как пользователь работает со своими " -"собственными классами сущностей и никогда не будет использовать прокси." +"Doctrine2 verwendet Proxies, um sein Framework zu implementieren (z.B. Lazy " +"Initialization), der User arbeitet aber dennoch mit seinen eigenen Entity " +"Klassen und wird niemals die Proxies anpassen" #: ../../Structural/Proxy/README.rst:17 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Structural/Proxy/README.rst:24 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Structural/Proxy/README.rst:26 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Structural/Proxy/README.rst:28 msgid "Record.php" @@ -63,4 +63,4 @@ msgstr "RecordProxy.php" #: ../../Structural/Proxy/README.rst:41 msgid "Test" -msgstr "Тест" +msgstr "Теst" diff --git a/locale/de/LC_MESSAGES/Structural/README.po b/locale/de/LC_MESSAGES/Structural/README.po index 3ecfece..1404b66 100644 --- a/locale/de/LC_MESSAGES/Structural/README.po +++ b/locale/de/LC_MESSAGES/Structural/README.po @@ -4,25 +4,25 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 23:27+0300\n" +"PO-Revision-Date: 2016-04-04 08:03+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Structural/README.rst:2 msgid "`Structural`__" -msgstr "" -"`Структурные шаблоны проектирования `_ (`Structural`__)" +msgstr "`Strukturell`__" #: ../../Structural/README.rst:4 msgid "" -"In Software Engineering, Structural Design Patterns are Design Patterns that" -" ease the design by identifying a simple way to realize relationships " +"In Software Engineering, Structural Design Patterns are Design Patterns " +"that ease the design by identifying a simple way to realize relationships " "between entities." msgstr "" -"При разработке программного обеспечения, Структурные шаблоны проектирования " -"упрощают проектирование путем выявления простого способа реализовать " -"отношения между субъектами." +"In der Softwareentwicklung bezeichnet man Strukturelle Muster als die " +"Design Patterns, die das Design vereinfachen, indem sie Beziehungen " +"zwischen Objekten realisieren." diff --git a/locale/de/LC_MESSAGES/Structural/Registry/README.po b/locale/de/LC_MESSAGES/Structural/Registry/README.po index 92e2d6e..b890133 100644 --- a/locale/de/LC_MESSAGES/Structural/Registry/README.po +++ b/locale/de/LC_MESSAGES/Structural/Registry/README.po @@ -4,20 +4,22 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-06-02 01:36+0300\n" +"PO-Revision-Date: 2016-04-04 08:02+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Structural/Registry/README.rst:2 msgid "`Registry`__" -msgstr "Реестр (Registry)" +msgstr "`Registry`__" #: ../../Structural/Registry/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Structural/Registry/README.rst:7 msgid "" @@ -25,41 +27,42 @@ msgid "" "application, is typically implemented using an abstract class with only " "static methods (or using the Singleton pattern)" msgstr "" -"Для реализации централизованного хранения объектов, часто используемых " -"во всем приложении, как правило, реализуется с помощью абстрактного " -"класса с только статическими методами (или с помощью шаблона Singleton)." +"Einen zentralen Speicher für Objekte zu implementieren, die oft " +"innerhalb der Anwendung benötigt werden. Wird üblicherweise als " +"abstrakte Klasse mit statischen Methoden (oder als Singleton) " +"implementiert" #: ../../Structural/Registry/README.rst:12 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../Structural/Registry/README.rst:14 msgid "" "Zend Framework: ``Zend_Registry`` holds the application's logger object, " "front controller etc." msgstr "" -"Zend Framework: ``Zend_Registry`` содержит объект журналирования " -"приложения (логгер), фронт-контроллер и т.д." +"Zend Framework: ``Zend_Registry`` hält die zentralen Objekte der " +"Anwendung: z.B. Logger oder Front Controller" #: ../../Structural/Registry/README.rst:16 msgid "" "Yii Framework: ``CWebApplication`` holds all the application components, " "such as ``CWebUser``, ``CUrlManager``, etc." msgstr "" -"Yii Framework: ``CWebApplication`` содержит все компоненты приложения, " -"такие как ``CWebUser``, ``CUrlManager``, и т.д." +"Yii Framework: ``CWebApplication`` hält alle Anwendungskomponenten, wie " +"z.B.``CWebUser``, ``CUrlManager``, etc." #: ../../Structural/Registry/README.rst:20 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Structural/Registry/README.rst:27 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Structural/Registry/README.rst:29 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Structural/Registry/README.rst:31 msgid "Registry.php" @@ -67,7 +70,7 @@ msgstr "Registry.php" #: ../../Structural/Registry/README.rst:38 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Structural/Registry/README.rst:40 msgid "Tests/RegistryTest.php" From c71fc4c26dd7a6e9c3fdf955a23f0f4f2ed3522f Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Mon, 4 Apr 2016 08:14:04 +0200 Subject: [PATCH 014/148] translated More --- .../de/LC_MESSAGES/More/Delegation/README.po | 20 ++++--- locale/de/LC_MESSAGES/More/README.po | 6 +- .../de/LC_MESSAGES/More/Repository/README.po | 36 +++++------ .../LC_MESSAGES/More/ServiceLocator/README.po | 59 ++++++++++--------- 4 files changed, 64 insertions(+), 57 deletions(-) diff --git a/locale/de/LC_MESSAGES/More/Delegation/README.po b/locale/de/LC_MESSAGES/More/Delegation/README.po index c33f3dc..be8af51 100644 --- a/locale/de/LC_MESSAGES/More/Delegation/README.po +++ b/locale/de/LC_MESSAGES/More/Delegation/README.po @@ -4,40 +4,42 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 04:46+0300\n" +"PO-Revision-Date: 2016-04-04 08:05+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../More/Delegation/README.rst:2 msgid "`Delegation`__" -msgstr "`Делегирование `_ (`Delegation`__)" +msgstr "`Delegation`__" #: ../../More/Delegation/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../More/Delegation/README.rst:7 ../../More/Delegation/README.rst:12 msgid "..." -msgstr "Основной шаблон проектирования, в котором объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту. Шаблон делегирования является фундаментальной абстракцией, на основе которой реализованы другие шаблоны - композиция (также называемая агрегацией), примеси (mixins) и аспекты (aspects). (c) wiki" +msgstr "..." #: ../../More/Delegation/README.rst:10 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../More/Delegation/README.rst:15 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../More/Delegation/README.rst:22 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../More/Delegation/README.rst:24 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../More/Delegation/README.rst:26 msgid "Usage.php" @@ -53,7 +55,7 @@ msgstr "JuniorDeveloper.php" #: ../../More/Delegation/README.rst:45 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../More/Delegation/README.rst:47 msgid "Tests/DelegationTest.php" diff --git a/locale/de/LC_MESSAGES/More/README.po b/locale/de/LC_MESSAGES/More/README.po index 24d65fc..a733fa2 100644 --- a/locale/de/LC_MESSAGES/More/README.po +++ b/locale/de/LC_MESSAGES/More/README.po @@ -4,13 +4,15 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: 2016-04-04 08:13+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../More/README.rst:2 msgid "More" -msgstr "Дополнительно" +msgstr "Weitere" diff --git a/locale/de/LC_MESSAGES/More/Repository/README.po b/locale/de/LC_MESSAGES/More/Repository/README.po index 5b9ec98..c323575 100644 --- a/locale/de/LC_MESSAGES/More/Repository/README.po +++ b/locale/de/LC_MESSAGES/More/Repository/README.po @@ -4,20 +4,22 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 05:02+0300\n" +"PO-Revision-Date: 2016-04-04 08:09+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../More/Repository/README.rst:2 msgid "Repository" -msgstr "Хранилище (Repository)" +msgstr "Repository" #: ../../More/Repository/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../More/Repository/README.rst:7 msgid "" @@ -28,25 +30,25 @@ msgid "" "also supports the objective of achieving a clean separation and one-way " "dependency between the domain and data mapping layers." msgstr "" -"Посредник между уровнями области определения (хранилище) и распределения " -"данных. Использует интерфейс, похожий на коллекции, для доступа к объектам " -"области определения. Репозиторий инкапсулирует набор объектов, сохраняемых " -"в хранилище данных, и операции выполняемые над ними, обеспечивая более " -"объектно-ориентированное представление реальных данных. Репозиторий также " -"преследует цель достижения полного разделения и односторонней зависимости " -"между уровнями области определения и распределения данных." +"Vermittelt zwischen dem Domain- und Data-Mapping-Layer indem es ein " +"Interface wie für eine Collection implementierung, um auf Domainobjekte zu " +"zugreifen. Das Repository kapselt dabei alle persistierten Objekte und die " +"Operationen auf diesen um eine objektorientierte Sicht auf die " +"Persistenzschicht zu implementieren. Das Repository unterstützt damit die " +"saubere Trennung und eine Abhängigkeit in nur eine Richtung von Domain- und " +"Data-Mapping-Layern." #: ../../More/Repository/README.rst:16 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../More/Repository/README.rst:18 msgid "" "Doctrine 2 ORM: there is Repository that mediates between Entity and DBAL " "and contains methods to retrieve objects" msgstr "" -"Doctrine 2 ORM: в ней есть Repository, который является связующим звеном " -"между Entity и DBAL и содержит методы для получения объектов." +"Doctrine 2 ORM: Repository vermittelt zwischen Entity und DBAL und enthält " +"verschiedene Methoden, um Entities zu erhalten" #: ../../More/Repository/README.rst:20 msgid "Laravel Framework" @@ -54,15 +56,15 @@ msgstr "Laravel Framework" #: ../../More/Repository/README.rst:23 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../More/Repository/README.rst:30 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../More/Repository/README.rst:32 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../More/Repository/README.rst:34 msgid "Post.php" @@ -82,4 +84,4 @@ msgstr "MemoryStorage.php" #: ../../More/Repository/README.rst:59 msgid "Test" -msgstr "Тест" +msgstr "Теst" diff --git a/locale/de/LC_MESSAGES/More/ServiceLocator/README.po b/locale/de/LC_MESSAGES/More/ServiceLocator/README.po index 4124706..543b932 100644 --- a/locale/de/LC_MESSAGES/More/ServiceLocator/README.po +++ b/locale/de/LC_MESSAGES/More/ServiceLocator/README.po @@ -4,52 +4,53 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 05:14+0300\n" +"PO-Revision-Date: 2016-04-04 08:13+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../More/ServiceLocator/README.rst:2 msgid "`Service Locator`__" -msgstr "Локатор Служб (`Service Locator`__)" +msgstr "`Service Locator`__" #: ../../More/ServiceLocator/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../More/ServiceLocator/README.rst:7 msgid "" -"To implement a loosely coupled architecture in order to get better testable," -" maintainable and extendable code. DI pattern and Service Locator pattern " -"are an implementation of the Inverse of Control pattern." +"To implement a loosely coupled architecture in order to get better " +"testable, maintainable and extendable code. DI pattern and Service Locator " +"pattern are an implementation of the Inverse of Control pattern." msgstr "" -"Для реализации слабосвязанной архитектуры, чтобы получить хорошо " -"тестируемый, сопровождаемый и расширяемый код. Паттерн Инъекция " -"зависимостей (DI) и паттерн Локатор Служб — это реализация паттерна " -"Инверсия управления (Inversion of Control, IoC)." +"Um eine lose gekoppelte Architektur zu erhalten, die testbar, wartbar und " +"erweiterbar ist. Sowohl das Dependency Injection, als auch das Service " +"Locator Pattern sind Implementierungen des Inverse Of Control Patterns." #: ../../More/ServiceLocator/README.rst:12 msgid "Usage" -msgstr "Использование" +msgstr "Verwendung" #: ../../More/ServiceLocator/README.rst:14 msgid "" -"With ``ServiceLocator`` you can register a service for a given interface. By" -" using the interface you can retrieve the service and use it in the classes " -"of the application without knowing its implementation. You can configure and" -" inject the Service Locator object on bootstrap." +"With ``ServiceLocator`` you can register a service for a given interface. " +"By using the interface you can retrieve the service and use it in the " +"classes of the application without knowing its implementation. You can " +"configure and inject the Service Locator object on bootstrap." msgstr "" -"С ``Локатором Служб`` вы можете зарегистрировать сервис для определенного " -"интерфейса. С помощью интерфейса вы можете получить зарегистрированный " -"сервис и использовать его в классах приложения, не зная его реализацию. Вы " -"можете настроить и внедрить объект Service Locator на начальном этапе " -"сборки приложения." +"Mit dem Service Locator kann ein Service anhand eines Interfaces " +"registriert werden. Mit dem Interface kann dann ein Service erhalten und " +"verwendet werden, ohne dass die Anwendung die genaue Implementierung kennen " +"muss. Der Service Locator selbst kann im Bootstrapping der Anwendung " +"konfiguriert und injiziert werden." #: ../../More/ServiceLocator/README.rst:20 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../More/ServiceLocator/README.rst:22 msgid "" @@ -57,22 +58,22 @@ msgid "" "the framework(i.e. EventManager, ModuleManager, all custom user services " "provided by modules, etc...)" msgstr "" -"Zend Framework 2 использует Service Locator для создания и совместного " -"использования сервисов, задействованных в фреймворке (т.е. EventManager, " -"ModuleManager, все пользовательские сервисы, предоставляемые модулями, и т." -"д ...)" +"Zend Framework 2 macht intensiven Gebrauch vom Service Locator, um im " +"Framework Services zu erstellen und zu teilen (z.B. EventManager, " +"ModuleManager, alle eigenen Services, die durch Module bereitgestellt " +"werden, usw...)" #: ../../More/ServiceLocator/README.rst:27 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../More/ServiceLocator/README.rst:34 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../More/ServiceLocator/README.rst:36 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../More/ServiceLocator/README.rst:38 msgid "ServiceLocatorInterface.php" @@ -100,7 +101,7 @@ msgstr "DatabaseService.php" #: ../../More/ServiceLocator/README.rst:75 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../More/ServiceLocator/README.rst:77 msgid "Tests/ServiceLocatorTest.php" From f4c2808f35b2f716c3d8f2920ace2e9de8d97e0e Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Mon, 4 Apr 2016 08:47:18 +0200 Subject: [PATCH 015/148] translated Creational --- .../Creational/AbstractFactory/README.po | 28 +++++----- .../LC_MESSAGES/Creational/Builder/README.po | 36 +++++++------ .../Creational/FactoryMethod/README.po | 35 ++++++------ .../LC_MESSAGES/Creational/Multiton/README.po | 33 ++++++------ .../de/LC_MESSAGES/Creational/Pool/README.po | 53 ++++++++++--------- .../Creational/Prototype/README.po | 29 +++++----- locale/de/LC_MESSAGES/Creational/README.po | 28 +++++----- .../Creational/SimpleFactory/README.po | 33 ++++++------ .../Creational/Singleton/README.po | 44 ++++++++------- .../Creational/StaticFactory/README.po | 36 +++++++------ .../Structural/DependencyInjection/README.po | 6 +-- 11 files changed, 185 insertions(+), 176 deletions(-) diff --git a/locale/de/LC_MESSAGES/Creational/AbstractFactory/README.po b/locale/de/LC_MESSAGES/Creational/AbstractFactory/README.po index 441094c..8b2bca1 100644 --- a/locale/de/LC_MESSAGES/Creational/AbstractFactory/README.po +++ b/locale/de/LC_MESSAGES/Creational/AbstractFactory/README.po @@ -4,22 +4,22 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 22:25+0300\n" +"PO-Revision-Date: 2016-04-04 08:20+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Creational/AbstractFactory/README.rst:2 msgid "`Abstract Factory`__" -msgstr "" -"`Абстрактная фабрика `_ (`Abstract Factory`__)" +msgstr "`Abstract Factory`__" #: ../../Creational/AbstractFactory/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Creational/AbstractFactory/README.rst:7 msgid "" @@ -28,23 +28,23 @@ msgid "" "interface. The client of the abstract factory does not care about how these " "objects are created, he just knows how they go together." msgstr "" -"Создать ряд связанных или зависимых объектов без указания их конкретных " -"классов. Обычно создаваемые классы стремятся реализовать один и тот же " -"интерфейс. Клиент абстрактной фабрики не заботится о том, как создаются эти " -"объекты, он просто знает, по каким признакам они взаимосвязаны и как с ними " -"обращаться." +"Um eine Serie von verwandten oder abhängigen Objekten zu erzeugen, ohne " +"deren konkrete Klassen spezifizieren zu müssen. Im Normalfall " +"implementieren alle diese dasselbe Interface. Der Client der abstrakten " +"Fabrik interessiert sich nicht dafür, wie die Objekte erzeugt werden, er " +"weiß nur, wie die Objekte zueinander gehören." #: ../../Creational/AbstractFactory/README.rst:13 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Creational/AbstractFactory/README.rst:20 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Creational/AbstractFactory/README.rst:22 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Creational/AbstractFactory/README.rst:24 msgid "AbstractFactory.php" @@ -88,7 +88,7 @@ msgstr "Html/Text.php" #: ../../Creational/AbstractFactory/README.rst:85 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Creational/AbstractFactory/README.rst:87 msgid "Tests/AbstractFactoryTest.php" diff --git a/locale/de/LC_MESSAGES/Creational/Builder/README.po b/locale/de/LC_MESSAGES/Creational/Builder/README.po index aa92d50..9cb0f96 100644 --- a/locale/de/LC_MESSAGES/Creational/Builder/README.po +++ b/locale/de/LC_MESSAGES/Creational/Builder/README.po @@ -4,54 +4,56 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 22:36+0300\n" +"PO-Revision-Date: 2016-04-04 08:22+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Creational/Builder/README.rst:2 msgid "`Builder`__" -msgstr "" -"`Строитель `_ (`Builder`__)" +msgstr "`Builder`__" #: ../../Creational/Builder/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Creational/Builder/README.rst:7 msgid "Builder is an interface that build parts of a complex object." -msgstr "Строитель — это интерфейс для производства частей сложного объекта." +msgstr "Builder ist ein Interface, das Teile eines komplexen Objekts aufbaut." #: ../../Creational/Builder/README.rst:9 msgid "" "Sometimes, if the builder has a better knowledge of what it builds, this " "interface could be an abstract class with default methods (aka adapter)." msgstr "" -"Иногда, если Строитель лучше знает о том, что он строит, этот интерфейс " -"может быть абстрактным классом с методами по-умолчанию (адаптер)." +"Manchmal, wenn der Builder ein gutes Bild davon hat, was er bauen solle, " +"dann kann dieses Interface aus auch einer abstrakten Klasse mit " +"Standardmethoden bestehen (siehe Adapter)." #: ../../Creational/Builder/README.rst:12 msgid "" "If you have a complex inheritance tree for objects, it is logical to have a " "complex inheritance tree for builders too." msgstr "" -"Если у вас есть сложное дерево наследования для объектов, логично иметь " -"сложное дерево наследования и для их строителей." +"Wenn du einen komplexen Vererbungsbaum für ein Objekt hast, ist es nur " +"logisch, dass auch der Builder über eine komplexe Vererbungshierarchie " +"verfügt." #: ../../Creational/Builder/README.rst:15 msgid "" "Note: Builders have often a fluent interface, see the mock builder of " "PHPUnit for example." msgstr "" -"Примечание: Строители могут иметь `текучий интерфейс `_, например, строитель макетов в PHPUnit." +"Hinweis: Builder haben oft auch ein Fluent Interface, siehe z.B. der " +"Mockbuilder in PHPUnit." #: ../../Creational/Builder/README.rst:19 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../Creational/Builder/README.rst:21 msgid "PHPUnit: Mock Builder" @@ -59,15 +61,15 @@ msgstr "PHPUnit: Mock Builder" #: ../../Creational/Builder/README.rst:24 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Creational/Builder/README.rst:31 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Creational/Builder/README.rst:33 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Creational/Builder/README.rst:35 msgid "Director.php" @@ -111,7 +113,7 @@ msgstr "Parts/Door.php" #: ../../Creational/Builder/README.rst:96 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Creational/Builder/README.rst:98 msgid "Tests/DirectorTest.php" diff --git a/locale/de/LC_MESSAGES/Creational/FactoryMethod/README.po b/locale/de/LC_MESSAGES/Creational/FactoryMethod/README.po index 916f12b..3a533db 100644 --- a/locale/de/LC_MESSAGES/Creational/FactoryMethod/README.po +++ b/locale/de/LC_MESSAGES/Creational/FactoryMethod/README.po @@ -4,65 +4,66 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 22:46+0300\n" +"PO-Revision-Date: 2016-04-04 08:25+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Creational/FactoryMethod/README.rst:2 msgid "`Factory Method`__" -msgstr "" -"`Фабричный Метод `_ (`Factory Method`__)" +msgstr "`Factory Method`__" #: ../../Creational/FactoryMethod/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Creational/FactoryMethod/README.rst:7 msgid "" "The good point over the SimpleFactory is you can subclass it to implement " "different ways to create objects" msgstr "" -"Выгодное отличие от SimpleFactory в том, что вы можете вынести реализацию " -"создания объектов в подклассы." +"Der Vorteil gegenüber einer SimpleFactory ist, dass die Factory über eine " +"Kindklasse erweitert werden kann, sodass es verschiedene Wege geben kann, " +"ein Objekt zu erzeugen" #: ../../Creational/FactoryMethod/README.rst:10 msgid "For simple case, this abstract class could be just an interface" msgstr "" -"В простых случаях, этот абстрактный класс может быть только интерфейсом." +"Für einfache Fälle kann statt der abstrakten Klasse auch einfach nur ein " +"Interface existieren" #: ../../Creational/FactoryMethod/README.rst:12 msgid "" "This pattern is a \"real\" Design Pattern because it achieves the " "\"Dependency Inversion Principle\" a.k.a the \"D\" in S.O.L.I.D principles." msgstr "" -"Этот паттерн является «настоящим» Шаблоном Проектирования, потому что он " -"следует «Принципу инверсии зависимостей\" ака \"D\" в `S.O.L.I.D `_." +"Dieses Muster ist ein \"echtes\" Muster, da es das \"D\" in S.O.L.I.D. " +"implementiert, das \"Dependency Inversion Prinzip\"." #: ../../Creational/FactoryMethod/README.rst:15 msgid "" "It means the FactoryMethod class depends on abstractions, not concrete " "classes. This is the real trick compared to SimpleFactory or StaticFactory." msgstr "" -"Это означает, что класс FactoryMethod зависит от абстракций, а не от " -"конкретных классов. Это существенный плюс в сравнении с SimpleFactory или " +"Die FactoryMethod ist abhängig von einer Abstraktion, nicht der konkreten " +"Klasse. Das ist der entscheidende Vorteil gegenüber der SimpleFactory oder " "StaticFactory." #: ../../Creational/FactoryMethod/README.rst:20 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Creational/FactoryMethod/README.rst:27 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Creational/FactoryMethod/README.rst:29 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Creational/FactoryMethod/README.rst:31 msgid "FactoryMethod.php" @@ -94,7 +95,7 @@ msgstr "Ferrari.php" #: ../../Creational/FactoryMethod/README.rst:74 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Creational/FactoryMethod/README.rst:76 msgid "Tests/FactoryMethodTest.php" diff --git a/locale/de/LC_MESSAGES/Creational/Multiton/README.po b/locale/de/LC_MESSAGES/Creational/Multiton/README.po index 509a9c0..70f4c1e 100644 --- a/locale/de/LC_MESSAGES/Creational/Multiton/README.po +++ b/locale/de/LC_MESSAGES/Creational/Multiton/README.po @@ -4,64 +4,63 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 22:58+0300\n" +"PO-Revision-Date: 2016-04-04 08:27+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Creational/Multiton/README.rst:2 msgid "Multiton" -msgstr "Пул одиночек (Multiton)" +msgstr "Multiton" #: ../../Creational/Multiton/README.rst:4 msgid "" "**THIS IS CONSIDERED TO BE AN ANTI-PATTERN! FOR BETTER TESTABILITY AND " "MAINTAINABILITY USE DEPENDENCY INJECTION!**" msgstr "" -"**Это считается анти-паттерном! Для лучшей тестируемости и сопровождения " -"кода используйте Инъекцию Зависимости (Dependency Injection)!**" +"**DIESES MUSTER IST EIN ANTI-PATTERN! FÜR BESSERE TESTBARKEIT UND " +"WARTBARKEIT VERWENDE STATTDESSEN DEPENDENCY INJECTION!**" #: ../../Creational/Multiton/README.rst:8 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Creational/Multiton/README.rst:10 msgid "" "To have only a list of named instances that are used, like a singleton but " "with n instances." msgstr "" -"Содержит список именованных созданных экземпляров классов, которые в итоге " -"используются как Singleton-ы, но в заданном заранее N-ном количестве." +"stellt eine Liste an benamten Instanzen bereit, genauso wie ein Singleton, " +"aber mit n Instanzen." #: ../../Creational/Multiton/README.rst:14 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../Creational/Multiton/README.rst:16 msgid "2 DB Connectors, e.g. one for MySQL, the other for SQLite" msgstr "" -"Два объекта для доступа к базам данных, к примеру, один для MySQL, а " -"второй для SQLite" +"zwei Datenbank-Konnektoren, z.B. einer für MySQL, ein anderer für SQLite" #: ../../Creational/Multiton/README.rst:17 msgid "multiple Loggers (one for debug messages, one for errors)" -msgstr "" -"Несколько логгирующих объектов (один для отладочных сообщений, другой для " -"ошибок и т.п.) " +msgstr "mehrere Logger (einer für Debugmeldungen, einer für Fehler)" #: ../../Creational/Multiton/README.rst:20 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Creational/Multiton/README.rst:27 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Creational/Multiton/README.rst:29 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Creational/Multiton/README.rst:31 msgid "Multiton.php" @@ -69,4 +68,4 @@ msgstr "Multiton.php" #: ../../Creational/Multiton/README.rst:38 msgid "Test" -msgstr "Тест" +msgstr "Теst" diff --git a/locale/de/LC_MESSAGES/Creational/Pool/README.po b/locale/de/LC_MESSAGES/Creational/Pool/README.po index 8c679b4..9357d4d 100644 --- a/locale/de/LC_MESSAGES/Creational/Pool/README.po +++ b/locale/de/LC_MESSAGES/Creational/Pool/README.po @@ -4,17 +4,18 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 23:08+0300\n" +"PO-Revision-Date: 2016-04-04 08:35+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Creational/Pool/README.rst:2 msgid "`Pool`__" -msgstr "" -"`Объектный пул `_ (`Pool`__)" +msgstr "`Pool`__" #: ../../Creational/Pool/README.rst:4 msgid "" @@ -25,25 +26,28 @@ msgid "" "object. When the client has finished, it returns the object, which is a " "specific type of factory object, to the pool rather than destroying it." msgstr "" -"Порождающий паттерн, который предоставляет набор заранее инициализированных " -"объектов, готовых к использованию («пул»), что не требует каждый раз " -"создавать и уничтожать их." +"Das **Objekt Pool Pattern** ist ein Erzeugungsmuster, das ein Set von " +"initialisierten Objekten bereithält - ein \"Pool\" - statt jedesmal ein " +"neues Objekt zu erzeugen und wieder zu zerstören bei Bedarf. Der Client des " +"Pools fragt ein Objekt an und erhält es von dem Pool, führt alle " +"gewünschten Operationen aus und gibt anschließend das Objekt zurück. Das " +"Objekt selbst ist wie eine spezielle Factory implementiert." #: ../../Creational/Pool/README.rst:11 msgid "" -"Object pooling can offer a significant performance boost in situations where" -" the cost of initializing a class instance is high, the rate of " +"Object pooling can offer a significant performance boost in situations " +"where the cost of initializing a class instance is high, the rate of " "instantiation of a class is high, and the number of instances in use at any " "one time is low. The pooled object is obtained in predictable time when " "creation of the new objects (especially over network) may take variable " "time." msgstr "" -"Хранение объектов в пуле может заметно повысить производительность в " -"ситуациях, когда стоимость инициализации экземпляра класса высока, скорость " -"экземпляра класса высока, а количество одновременно используемых " -"экземпляров в любой момент времени является низкой. Время на извлечение " -"объекта из пула легко прогнозируется, в отличие от создания новых объектов " -"(особенно с сетевым оверхедом), что занимает неопределённое время." +"Dieses Muster kann die Performance einer Anwendung entscheidend verbessern, " +"wenn die Erzeugung von Objekten teuer ist, oft neue Objekte erzeugt werden " +"müssen und die gleichzeitig verwendete Anzahl von Instanzen eher gering " +"ist. Das Objekt im Pool wird in konstanter Zeit erzeugt, wohingegen die " +"Erzeugung neuer Objekte (vorallem über das Netzwerk) variable Zeit in " +"Anspruch nimmt und bei hoher Auslastung zum Problem führen würde." #: ../../Creational/Pool/README.rst:18 msgid "" @@ -53,25 +57,24 @@ msgid "" "simple object pooling (that hold no external resources, but only occupy " "memory) may not be efficient and could decrease performance." msgstr "" -"Однако эти преимущества в основном относится к объектам, которые изначально " -"являются дорогостоящими по времени создания. Например, соединения с базой " -"данных, соединения сокетов, потоков и инициализация больших графических " -"объектов, таких как шрифты или растровые изображения. В некоторых " -"ситуациях, использование простого пула объектов (которые не зависят от " -"внешних ресурсов, а только занимают память) может оказаться неэффективным и " -"приведёт к снижению производительности." +"Diese Vorteile können vorallem bei teuren Objekterzeugungen ausgespielt " +"werden, wie z.B. Datenbankverbindungen, Socketverbindungen, Threads und " +"großen Grafikobjekten wie Schriften oder Bitmaps. In manchen Situationen, " +"in denen Objekte nur Speicher verbrauchen, aber nicht von externen " +"Resourcen abhängig sind, wird das Muster nicht effizient sein und kann " +"stattdessen die Performance beinträchtigen." #: ../../Creational/Pool/README.rst:25 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Creational/Pool/README.rst:32 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Creational/Pool/README.rst:34 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Creational/Pool/README.rst:36 msgid "Pool.php" @@ -87,7 +90,7 @@ msgstr "Worker.php" #: ../../Creational/Pool/README.rst:55 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Creational/Pool/README.rst:57 msgid "Tests/PoolTest.php" diff --git a/locale/de/LC_MESSAGES/Creational/Prototype/README.po b/locale/de/LC_MESSAGES/Creational/Prototype/README.po index f249bce..ea5e199 100644 --- a/locale/de/LC_MESSAGES/Creational/Prototype/README.po +++ b/locale/de/LC_MESSAGES/Creational/Prototype/README.po @@ -4,54 +4,55 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 23:13+0300\n" +"PO-Revision-Date: 2016-04-04 08:36+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Creational/Prototype/README.rst:2 msgid "`Prototype`__" -msgstr "" -"`Прототип `_ (`Prototype`__)" +msgstr "`Prototype`__" #: ../../Creational/Prototype/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Creational/Prototype/README.rst:7 msgid "" "To avoid the cost of creating objects the standard way (new Foo()) and " "instead create a prototype and clone it." msgstr "" -"Помогает избежать затрат на создание объектов стандартным способом (new " -"Foo()), а вместо этого создаёт прототип и затем клонирует его." +"Um die Kosten der Erzeugung von Objekten über den normalen Weg (new Foo()) " +"zu vermeiden und stattdessen einen Prototyp zu erzeugen, der bei Bedarf " +"gecloned werden kann." #: ../../Creational/Prototype/README.rst:11 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../Creational/Prototype/README.rst:13 msgid "" "Large amounts of data (e.g. create 1,000,000 rows in a database at once via " "a ORM)." msgstr "" -"Большие объемы данных (например, создать 1000000 строк в базе данных сразу " -"через ORM)." +"Große Mengen von Daten (z.B. 1 Mio. Zeilen werden in einer Datenbank über " +"ein ORM erzeugt)." #: ../../Creational/Prototype/README.rst:17 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Creational/Prototype/README.rst:24 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Creational/Prototype/README.rst:26 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Creational/Prototype/README.rst:28 msgid "index.php" @@ -71,4 +72,4 @@ msgstr "FooBookPrototype.php" #: ../../Creational/Prototype/README.rst:53 msgid "Test" -msgstr "Тест" +msgstr "Теst" diff --git a/locale/de/LC_MESSAGES/Creational/README.po b/locale/de/LC_MESSAGES/Creational/README.po index 7f5c8f8..827bc24 100644 --- a/locale/de/LC_MESSAGES/Creational/README.po +++ b/locale/de/LC_MESSAGES/Creational/README.po @@ -4,28 +4,30 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 23:11+0300\n" +"PO-Revision-Date: 2016-04-04 08:39+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Creational/README.rst:2 msgid "`Creational`__" -msgstr "Порождающие шаблоны проектирования (`Creational`__)" +msgstr "`Erzeugung`__" #: ../../Creational/README.rst:4 msgid "" -"In software engineering, creational design patterns are design patterns that" -" deal with object creation mechanisms, trying to create objects in a manner " -"suitable to the situation. The basic form of object creation could result in" -" design problems or added complexity to the design. Creational design " -"patterns solve this problem by somehow controlling this object creation." +"In software engineering, creational design patterns are design patterns " +"that deal with object creation mechanisms, trying to create objects in a " +"manner suitable to the situation. The basic form of object creation could " +"result in design problems or added complexity to the design. Creational " +"design patterns solve this problem by somehow controlling this object " +"creation." msgstr "" -"В разработке программного обеспечения, Порождающие шаблоны проектирования – " -"это паттерны, которые имеют дело с механизмами создания объекта и пытаются " -"создать объекты в порядке, подходящем к ситуации. Обычная форма создания " -"объекта может привести к проблемам проектирования или увеличивать сложность " -"конструкции. Порождающие шаблоны проектирования решают эту проблему, " -"определённым образом контролируя процесс создания объекта." +"In der Softwareentwicklung bezeichnet man die Muster, die neue Objekte in " +"passender Art und Weise erzeugen als Erzeugungsmuster. Die einfache Form " +"der Erzeugung kann in bestimmten Situationen zu Problemen oder erhöhte " +"Komplexität im Design führen. Erzeugungsmuster lösen dieses Problem, in dem " +"sie Objekterzeugung kontrollieren." diff --git a/locale/de/LC_MESSAGES/Creational/SimpleFactory/README.po b/locale/de/LC_MESSAGES/Creational/SimpleFactory/README.po index 6e07bbd..c9f582f 100644 --- a/locale/de/LC_MESSAGES/Creational/SimpleFactory/README.po +++ b/locale/de/LC_MESSAGES/Creational/SimpleFactory/README.po @@ -4,53 +4,56 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 23:17+0300\n" +"PO-Revision-Date: 2016-04-04 08:41+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Creational/SimpleFactory/README.rst:2 msgid "Simple Factory" -msgstr "Простая Фабрика (Simple Factory)" +msgstr "Simple Factory" #: ../../Creational/SimpleFactory/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Creational/SimpleFactory/README.rst:7 msgid "SimpleFactory is a simple factory pattern." -msgstr "SimpleFactory в примере ниже, это паттерн «Простая Фабрика»." +msgstr "SimpleFactory ist ein vereinfachtes Factory Muster." #: ../../Creational/SimpleFactory/README.rst:9 msgid "" -"It differs from the static factory because it is NOT static and as you know:" -" static => global => evil!" +"It differs from the static factory because it is NOT static and as you " +"know: static => global => evil!" msgstr "" -"Она отличается от Статической Фабрики тем, что собственно *не является " -"статической*. Потому как вы должны знаеть: статическая => глобальная => зло!" +"Es hebt sich von der Static Factory ab, in dem es KEINE statischen Methoden " +"anbietet, da statische Methoden global verfügbar sind und damit sich " +"Probleme bei z.B. der Testbarkeit ergeben können." #: ../../Creational/SimpleFactory/README.rst:12 msgid "" "Therefore, you can have multiple factories, differently parametrized, you " "can subclass it and you can mock-up it." msgstr "" -"Таким образом, вы можете иметь несколько фабрик, параметризованных " -"различным образом. Вы можете унаследовать их и создавать макеты для " -"тестирования." +"Deshalb kann es mehrere Factories geben, die verschieden parametrisiert " +"werden können und durch Kindklassen erweitert und für Tests gemocked werden " +"können." #: ../../Creational/SimpleFactory/README.rst:16 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Creational/SimpleFactory/README.rst:23 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Creational/SimpleFactory/README.rst:25 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Creational/SimpleFactory/README.rst:27 msgid "SimpleFactory.php" @@ -70,7 +73,7 @@ msgstr "Scooter.php" #: ../../Creational/SimpleFactory/README.rst:52 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Creational/SimpleFactory/README.rst:54 msgid "Tests/SimpleFactoryTest.php" diff --git a/locale/de/LC_MESSAGES/Creational/Singleton/README.po b/locale/de/LC_MESSAGES/Creational/Singleton/README.po index 15c9e62..d96cf09 100644 --- a/locale/de/LC_MESSAGES/Creational/Singleton/README.po +++ b/locale/de/LC_MESSAGES/Creational/Singleton/README.po @@ -4,75 +4,73 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 23:20+0300\n" +"PO-Revision-Date: 2016-04-04 08:44+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Creational/Singleton/README.rst:2 msgid "`Singleton`__" -msgstr "" -"`Одиночка `_ (`Singleton`__)" +msgstr "`Singleton`__" #: ../../Creational/Singleton/README.rst:4 msgid "" "**THIS IS CONSIDERED TO BE AN ANTI-PATTERN! FOR BETTER TESTABILITY AND " "MAINTAINABILITY USE DEPENDENCY INJECTION!**" msgstr "" -"**Это считается анти-паттерном! Для лучшей тестируемости и " -"сопровождения кода используйте Инъекцию Зависимости (Dependency " -"Injection)!**" +"**DIESES MUSTER IST EIN ANTI-PATTERN! FÜR BESSERE TESTBARKEIT UND " +"WARTBARKEIT, VERWENDE DAS DEPENDENCY INJECTION MUSTER!**" #: ../../Creational/Singleton/README.rst:8 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Creational/Singleton/README.rst:10 msgid "" -"To have only one instance of this object in the application that will handle" -" all calls." +"To have only one instance of this object in the application that will " +"handle all calls." msgstr "" -"Позволяет содержать только один экземпляр объекта в приложении, " -"которое будет обрабатывать все обращения, запрещая создавать новый " -"экземпляр." +"Um nur eine einzelne Instanz eines Objekts in der Anwendung zu verwenden, " +"die alle Aufrufe abarbeitet." #: ../../Creational/Singleton/README.rst:14 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../Creational/Singleton/README.rst:16 msgid "DB Connector" -msgstr "DB Connector для подключения к базе данных" +msgstr "DB Konnektor" #: ../../Creational/Singleton/README.rst:17 msgid "" "Logger (may also be a Multiton if there are many log files for several " "purposes)" msgstr "" -"Logger (также может быть Multiton если есть много журналов для " -"нескольких целей)" +"Logger (kann auch ein Multiton sein, falls es mehrere Logfiles für " +"verschiedene Zwecke gibt)" #: ../../Creational/Singleton/README.rst:19 msgid "" "Lock file for the application (there is only one in the filesystem ...)" msgstr "" -"Блокировка файла в приложении (есть только один в файловой системе с " -"одновременным доступом к нему)" +"Lock file für die Anwendung (falls diese nur einmal auf dem System laufen " +"darf ...)" #: ../../Creational/Singleton/README.rst:23 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Creational/Singleton/README.rst:30 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Creational/Singleton/README.rst:32 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Creational/Singleton/README.rst:34 msgid "Singleton.php" @@ -80,7 +78,7 @@ msgstr "Singleton.php" #: ../../Creational/Singleton/README.rst:41 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Creational/Singleton/README.rst:43 msgid "Tests/SingletonTest.php" diff --git a/locale/de/LC_MESSAGES/Creational/StaticFactory/README.po b/locale/de/LC_MESSAGES/Creational/StaticFactory/README.po index 805d0ff..995cfd1 100644 --- a/locale/de/LC_MESSAGES/Creational/StaticFactory/README.po +++ b/locale/de/LC_MESSAGES/Creational/StaticFactory/README.po @@ -4,20 +4,22 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 23:24+0300\n" +"PO-Revision-Date: 2016-04-04 08:47+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" +"Language-Team: \n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Creational/StaticFactory/README.rst:2 msgid "Static Factory" -msgstr "Статическая Фабрика (Static Factory)" +msgstr "Static Factory" #: ../../Creational/StaticFactory/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "Zweck" #: ../../Creational/StaticFactory/README.rst:7 msgid "" @@ -27,35 +29,35 @@ msgid "" "method to create all types of objects it can create. It is usually named " "``factory`` or ``build``." msgstr "" -"Подобно AbstractFactory, этот паттерн используется для создания ряда " -"связанных или зависимых объектов. Разница между этим шаблоном и Абстрактной " -"Фабрикой заключается в том, что Статическая Фабрика использует только один " -"статический метод, чтобы создать все допустимые типы объектов. Этот метод, " -"обычно, называется ``factory`` или ``build``." +"Ähnlich zur AbstractFactory wird dieses Pattern dafür verwendet, eine Serie " +"von Objekten zu erzeugen, die zueinander in Beziehung stehen oder " +"voneinander abhängig sind. Der Unterschied liegt darin, dass die Static " +"Factory nur eine statische Methode zur Verfügung stellt, um alle Arten von " +"Objekten zu erzeugen. Diese heißt typischerweise ``factory`` oder ``build``." #: ../../Creational/StaticFactory/README.rst:14 msgid "Examples" -msgstr "Примеры" +msgstr "Beispiele" #: ../../Creational/StaticFactory/README.rst:16 msgid "" -"Zend Framework: ``Zend_Cache_Backend`` or ``_Frontend`` use a factory method" -" create cache backends or frontends" +"Zend Framework: ``Zend_Cache_Backend`` or ``_Frontend`` use a factory " +"method create cache backends or frontends" msgstr "" -"Zend Framework: ``Zend_Cache_Backend`` или ``_Frontend`` использует " -"фабричный метод для создания cache backends или frontends" +"Zend Framework: ``Zend_Cache_Backend`` oder ``_Frontend`` benutzen eine " +"Factory Methode, um Cache Backends oder Frontends zu erzeugen" #: ../../Creational/StaticFactory/README.rst:20 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "UML Diagramm" #: ../../Creational/StaticFactory/README.rst:27 msgid "Code" -msgstr "Код" +msgstr "Code" #: ../../Creational/StaticFactory/README.rst:29 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "Du findest den Code auch auf `GitHub`_" #: ../../Creational/StaticFactory/README.rst:31 msgid "StaticFactory.php" @@ -75,7 +77,7 @@ msgstr "FormatNumber.php" #: ../../Creational/StaticFactory/README.rst:56 msgid "Test" -msgstr "Тест" +msgstr "Теst" #: ../../Creational/StaticFactory/README.rst:58 msgid "Tests/StaticFactoryTest.php" diff --git a/locale/de/LC_MESSAGES/Structural/DependencyInjection/README.po b/locale/de/LC_MESSAGES/Structural/DependencyInjection/README.po index 4bb372c..47ebbfd 100644 --- a/locale/de/LC_MESSAGES/Structural/DependencyInjection/README.po +++ b/locale/de/LC_MESSAGES/Structural/DependencyInjection/README.po @@ -4,7 +4,7 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2016-04-04 07:49+0200\n" +"PO-Revision-Date: 2016-04-04 08:17+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -15,9 +15,7 @@ msgstr "" #: ../../Structural/DependencyInjection/README.rst:2 msgid "`Dependency Injection`__" -msgstr "" -"`Внедрение Зависимости `_ (`Dependency Injection`__)" +msgstr "`Dependency Injection`__" #: ../../Structural/DependencyInjection/README.rst:5 msgid "Purpose" From 3327732fb4a8b958b0457c7eda9d9967d0570c49 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Mon, 4 Apr 2016 13:13:04 +0200 Subject: [PATCH 016/148] addes missing translation for Iterator --- locale/de/LC_MESSAGES/Behavioral/Iterator/README.po | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/locale/de/LC_MESSAGES/Behavioral/Iterator/README.po b/locale/de/LC_MESSAGES/Behavioral/Iterator/README.po index 56e4f7f..622e07d 100644 --- a/locale/de/LC_MESSAGES/Behavioral/Iterator/README.po +++ b/locale/de/LC_MESSAGES/Behavioral/Iterator/README.po @@ -4,18 +4,18 @@ msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2016-03-29 05:44+0200\n" +"PO-Revision-Date: 2016-04-04 13:12+0200\n" "Last-Translator: Dominik Liebler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Language-Team: \n" -"X-Generator: Poedit 1.8.7\n" +"X-Generator: Poedit 1.8.7.1\n" #: ../../Behavioral/Iterator/README.rst:2 msgid "`Iterator`__" -msgstr "`Итератор `_ (`Iterator`__)" +msgstr "`Iterator`__" #: ../../Behavioral/Iterator/README.rst:5 msgid "Purpose" @@ -24,6 +24,8 @@ msgstr "Zweck" #: ../../Behavioral/Iterator/README.rst:7 msgid "To make an object iterable and to make it appear like a collection of objects." msgstr "" +"Um ein Objekt iterierbar zu machen und es nach außen aussehen zu lassen wie eine Sammlung von " +"Objekten." #: ../../Behavioral/Iterator/README.rst:11 msgid "Examples" @@ -34,6 +36,8 @@ msgid "" "to process a file line by line by just running over all lines (which have an object " "representation) for a file (which of course is an object, too)" msgstr "" +"Um eine Datei zeilenweise zu verarbeiten, in dem man über die Zeilen iteriert (die selbst auch " +"Objekte sind)" #: ../../Behavioral/Iterator/README.rst:18 msgid "Note" @@ -45,6 +49,9 @@ msgid "" "would want to implement the Countable interface too, to allow ``count($object)`` on your iterable " "object" msgstr "" +"Standard PHP Library (SPL) stellt ein Interface `Iterator` bereit, das zu diesem Zweck bestens " +"geeignet ist. Oftmals sollte man das Countable Interface auch implementieren, um " +"``count($object)`` auf dem Objekt zu erlauben." #: ../../Behavioral/Iterator/README.rst:25 msgid "UML Diagram" From b8e602f66d338d3e9c8b07aa737fd473f5b106c2 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 7 Apr 2016 08:41:33 +0200 Subject: [PATCH 017/148] fixed CS issues --- Structural/Flyweight/CharacterFlyweight.php | 3 ++- Structural/Flyweight/FlyweightFactory.php | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Structural/Flyweight/CharacterFlyweight.php b/Structural/Flyweight/CharacterFlyweight.php index 43908c1..d10cd03 100644 --- a/Structural/Flyweight/CharacterFlyweight.php +++ b/Structural/Flyweight/CharacterFlyweight.php @@ -19,7 +19,8 @@ class CharacterFlyweight implements FlyweightInterface * Constructor. * @param string $name */ - public function __construct($name) { + public function __construct($name) + { $this->name = $name; } diff --git a/Structural/Flyweight/FlyweightFactory.php b/Structural/Flyweight/FlyweightFactory.php index 5b17a43..6f70372 100644 --- a/Structural/Flyweight/FlyweightFactory.php +++ b/Structural/Flyweight/FlyweightFactory.php @@ -31,6 +31,6 @@ class FlyweightFactory public function totalNumber() { - return sizeof($this->pool); + return sizeof($this->pool); } } From d9d3f1213213ef6659aa1f200ba117d2534d1640 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 7 Apr 2016 08:53:37 +0200 Subject: [PATCH 018/148] added README.rst to FlyweightFactory --- Structural/Flyweight/FlyweightFactory.php | 5 +++ Structural/Flyweight/README.rst | 51 +++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 Structural/Flyweight/README.rst diff --git a/Structural/Flyweight/FlyweightFactory.php b/Structural/Flyweight/FlyweightFactory.php index 6f70372..a15a07b 100644 --- a/Structural/Flyweight/FlyweightFactory.php +++ b/Structural/Flyweight/FlyweightFactory.php @@ -12,12 +12,14 @@ class FlyweightFactory { /** * Associative store for flyweight objects + * * @var Array */ private $pool = array(); /** * Magic getter + * * @param string $name * @return Flyweight */ @@ -29,6 +31,9 @@ class FlyweightFactory return $this->pool[$name]; } + /** + * @return int + */ public function totalNumber() { return sizeof($this->pool); diff --git a/Structural/Flyweight/README.rst b/Structural/Flyweight/README.rst new file mode 100644 index 0000000..322ebad --- /dev/null +++ b/Structural/Flyweight/README.rst @@ -0,0 +1,51 @@ +`Flyweight`__ +========== + +Purpose +------- + +To minimise memory usage, a Flyweight shares as much as possible memory with similar objects. It +is needed when a large amount of objects is used that don't differ much in state. A common practice is +to hold state in external data structures and pass them to the flyweight object when needed. + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Facade UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +FlyweightInterface.php + +.. literalinclude:: FlyweightInterface.php + :language: php + :linenos: + +CharacterFlyweight.php + +.. literalinclude:: CharacterFlyweight.php + :language: php + :linenos: + +FlyweightFactory.php + +.. literalinclude:: FlyweightFactory.php + :language: php + :linenos: + +Test +---- + +Tests/FlyweightTest.php + +.. literalinclude:: Tests/FlyweightTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Flyweight +.. __: https://en.wikipedia.org/wiki/Flyweight_pattern From 3fcf860cf3ed918a6c2289f7f0c37c27c0dfbeea Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 7 Apr 2016 08:59:31 +0200 Subject: [PATCH 019/148] Fixed style --- Structural/Flyweight/CharacterFlyweight.php | 2 +- Structural/Flyweight/FlyweightFactory.php | 5 +++-- Structural/Flyweight/FlyweightInterface.php | 3 +++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Structural/Flyweight/CharacterFlyweight.php b/Structural/Flyweight/CharacterFlyweight.php index d10cd03..d0c6399 100644 --- a/Structural/Flyweight/CharacterFlyweight.php +++ b/Structural/Flyweight/CharacterFlyweight.php @@ -16,7 +16,6 @@ class CharacterFlyweight implements FlyweightInterface private $name; /** - * Constructor. * @param string $name */ public function __construct($name) @@ -27,6 +26,7 @@ class CharacterFlyweight implements FlyweightInterface /** * Clients supply the context-dependent information that the flyweight needs to draw itself * For flyweights representing characters, extrinsic state usually contains e.g. the font + * * @param string $font */ public function draw($font) diff --git a/Structural/Flyweight/FlyweightFactory.php b/Structural/Flyweight/FlyweightFactory.php index a15a07b..c709363 100644 --- a/Structural/Flyweight/FlyweightFactory.php +++ b/Structural/Flyweight/FlyweightFactory.php @@ -12,7 +12,7 @@ class FlyweightFactory { /** * Associative store for flyweight objects - * + * * @var Array */ private $pool = array(); @@ -28,6 +28,7 @@ class FlyweightFactory if (!array_key_exists($name, $this->pool)) { $this->pool[$name] = new CharacterFlyweight($name); } + return $this->pool[$name]; } @@ -36,6 +37,6 @@ class FlyweightFactory */ public function totalNumber() { - return sizeof($this->pool); + return count($this->pool); } } diff --git a/Structural/Flyweight/FlyweightInterface.php b/Structural/Flyweight/FlyweightInterface.php index e48bb8f..023419c 100644 --- a/Structural/Flyweight/FlyweightInterface.php +++ b/Structural/Flyweight/FlyweightInterface.php @@ -7,5 +7,8 @@ namespace DesignPatterns\Structural\Flyweight; */ interface FlyweightInterface { + /** + * @param string $extrinsicState + */ public function draw($extrinsicState); } From acdef3f6e9fd21d23b5b3f7dba9f53ccd984dd30 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Fri, 13 May 2016 10:23:19 +0200 Subject: [PATCH 020/148] fixed return type of RendererInterface --- Structural/Decorator/RenderInJson.php | 6 ++---- Structural/Decorator/RenderInXml.php | 6 ++---- Structural/Decorator/RendererInterface.php | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/Structural/Decorator/RenderInJson.php b/Structural/Decorator/RenderInJson.php index 71943bd..fb9a71e 100644 --- a/Structural/Decorator/RenderInJson.php +++ b/Structural/Decorator/RenderInJson.php @@ -10,12 +10,10 @@ class RenderInJson extends Decorator /** * render data as JSON. * - * @return mixed|string + * @return string */ public function renderData() { - $output = $this->wrapped->renderData(); - - return json_encode($output); + return json_encode($this->wrapped->renderData()); } } diff --git a/Structural/Decorator/RenderInXml.php b/Structural/Decorator/RenderInXml.php index 2eab7ca..f203d53 100644 --- a/Structural/Decorator/RenderInXml.php +++ b/Structural/Decorator/RenderInXml.php @@ -10,17 +10,15 @@ class RenderInXml extends Decorator /** * render data as XML. * - * @return mixed|string + * @return string */ public function renderData() { - $output = $this->wrapped->renderData(); - // do some fancy conversion to xml from array ... $doc = new \DOMDocument(); - foreach ($output as $key => $val) { + foreach ($this->wrapped->renderData() as $key => $val) { $doc->appendChild($doc->createElement($key, $val)); } diff --git a/Structural/Decorator/RendererInterface.php b/Structural/Decorator/RendererInterface.php index 92b00ef..73152b9 100644 --- a/Structural/Decorator/RendererInterface.php +++ b/Structural/Decorator/RendererInterface.php @@ -10,7 +10,7 @@ interface RendererInterface /** * render data. * - * @return mixed + * @return string */ public function renderData(); } From a98e962e507bee46142ca6d5faa7f0b528203ec4 Mon Sep 17 00:00:00 2001 From: Ivan Romanko Date: Wed, 18 May 2016 19:52:18 +0300 Subject: [PATCH 021/148] fixed russian translation --- locale/ru/LC_MESSAGES/Structural/DependencyInjection/README.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/ru/LC_MESSAGES/Structural/DependencyInjection/README.po b/locale/ru/LC_MESSAGES/Structural/DependencyInjection/README.po index 83986ad..15e3f62 100644 --- a/locale/ru/LC_MESSAGES/Structural/DependencyInjection/README.po +++ b/locale/ru/LC_MESSAGES/Structural/DependencyInjection/README.po @@ -85,7 +85,7 @@ msgid "" "objects via a configuration array and inject them where needed (i.e. in " "Controllers)" msgstr "" -"Symfony and Zend Framework 2 уже содержат контейнеры для DI, которые " +"Symfony и Zend Framework 2 уже содержат контейнеры для DI, которые " "создают объекты с помощью массива из конфигурации, и внедряют их в случае " "необходимости (т.е. в Контроллерах)." From 0870927cef964803e1d9772bf4e2f5c18e0c7d83 Mon Sep 17 00:00:00 2001 From: michael chrisco Date: Wed, 25 May 2016 08:07:40 -0700 Subject: [PATCH 022/148] Spelling over Test case --- Structural/Composite/Tests/CompositeTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Structural/Composite/Tests/CompositeTest.php b/Structural/Composite/Tests/CompositeTest.php index 510a06b..024cadf 100644 --- a/Structural/Composite/Tests/CompositeTest.php +++ b/Structural/Composite/Tests/CompositeTest.php @@ -23,8 +23,8 @@ class CompositeTest extends \PHPUnit_Framework_TestCase } /** - * The all point of this pattern, a Composite must inherit from the node - * if you want to builld trees. + * The point of this pattern, a Composite must inherit from the node + * if you want to build trees. */ public function testFormImplementsFormEelement() { From 557ac019b13d61a6641266c8928d75f8c8b2fc9a Mon Sep 17 00:00:00 2001 From: shangguokan Date: Sat, 4 Jun 2016 01:16:55 +0200 Subject: [PATCH 023/148] update all .po files --- More/README.rst | 1 + README.md | 1 + README.rst | 2 +- Structural/Flyweight/README.rst | 2 +- Structural/README.md | 1 + Structural/README.rst | 1 + .../LC_MESSAGES/Behavioral/Mediator/README.po | 4 +- .../LC_MESSAGES/Behavioral/Memento/README.po | 113 ++++--- .../ca/LC_MESSAGES/More/Delegation/README.po | 30 +- locale/ca/LC_MESSAGES/More/EAV/README.po | 78 +++++ locale/ca/LC_MESSAGES/README.po | 2 +- .../Structural/Flyweight/README.po | 69 +++++ .../LC_MESSAGES/Structural/Registry/README.po | 4 +- .../LC_MESSAGES/Behavioral/Mediator/README.po | 6 +- .../LC_MESSAGES/Behavioral/Memento/README.po | 253 ++++++++++++---- .../de/LC_MESSAGES/More/Delegation/README.po | 60 ++-- locale/de/LC_MESSAGES/More/EAV/README.po | 78 +++++ locale/de/LC_MESSAGES/README.po | 4 +- .../Structural/Flyweight/README.po | 69 +++++ .../LC_MESSAGES/Structural/Registry/README.po | 6 +- .../LC_MESSAGES/Behavioral/Mediator/README.po | 4 +- .../LC_MESSAGES/Behavioral/Memento/README.po | 200 ++++++++++--- .../es/LC_MESSAGES/More/Delegation/README.po | 30 +- locale/es/LC_MESSAGES/More/EAV/README.po | 78 +++++ locale/es/LC_MESSAGES/README.po | 4 +- .../Structural/Flyweight/README.po | 69 +++++ .../LC_MESSAGES/Structural/Registry/README.po | 4 +- .../LC_MESSAGES/Behavioral/Mediator/README.po | 4 +- .../LC_MESSAGES/Behavioral/Memento/README.po | 200 ++++++++++--- .../LC_MESSAGES/More/Delegation/README.po | 32 +- locale/pt_BR/LC_MESSAGES/More/EAV/README.po | 78 +++++ locale/pt_BR/LC_MESSAGES/README.po | 4 +- .../Structural/Flyweight/README.po | 69 +++++ .../LC_MESSAGES/Structural/Registry/README.po | 4 +- .../LC_MESSAGES/Behavioral/Mediator/README.po | 6 +- .../LC_MESSAGES/Behavioral/Memento/README.po | 282 +++++++++++++----- .../ru/LC_MESSAGES/More/Delegation/README.po | 120 ++++++-- locale/ru/LC_MESSAGES/More/EAV/README.po | 78 +++++ locale/ru/LC_MESSAGES/README.po | 4 +- .../Structural/Flyweight/README.po | 69 +++++ .../LC_MESSAGES/Structural/Registry/README.po | 6 +- .../LC_MESSAGES/Behavioral/Mediator/README.po | 4 +- .../LC_MESSAGES/Behavioral/Memento/README.po | 133 ++++----- .../LC_MESSAGES/More/Delegation/README.po | 45 +-- locale/zh_CN/LC_MESSAGES/More/EAV/README.po | 78 +++++ locale/zh_CN/LC_MESSAGES/README.po | 4 +- .../Structural/Flyweight/README.po | 69 +++++ .../LC_MESSAGES/Structural/Registry/README.po | 4 +- 48 files changed, 2024 insertions(+), 442 deletions(-) create mode 100644 locale/ca/LC_MESSAGES/More/EAV/README.po create mode 100644 locale/ca/LC_MESSAGES/Structural/Flyweight/README.po create mode 100644 locale/de/LC_MESSAGES/More/EAV/README.po create mode 100644 locale/de/LC_MESSAGES/Structural/Flyweight/README.po create mode 100644 locale/es/LC_MESSAGES/More/EAV/README.po create mode 100644 locale/es/LC_MESSAGES/Structural/Flyweight/README.po create mode 100644 locale/pt_BR/LC_MESSAGES/More/EAV/README.po create mode 100644 locale/pt_BR/LC_MESSAGES/Structural/Flyweight/README.po create mode 100644 locale/ru/LC_MESSAGES/More/EAV/README.po create mode 100644 locale/ru/LC_MESSAGES/Structural/Flyweight/README.po create mode 100644 locale/zh_CN/LC_MESSAGES/More/EAV/README.po create mode 100644 locale/zh_CN/LC_MESSAGES/Structural/Flyweight/README.po diff --git a/More/README.rst b/More/README.rst index dbab1f6..a2de938 100644 --- a/More/README.rst +++ b/More/README.rst @@ -7,3 +7,4 @@ More Delegation/README ServiceLocator/README Repository/README + EAV/README diff --git a/README.md b/README.md index a378e35..9f3bef6 100755 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ The patterns can be structured in roughly three different categories. Please cli * [DependencyInjection](Structural/DependencyInjection) [:notebook:](http://en.wikipedia.org/wiki/Dependency_injection) * [Facade](Structural/Facade) [:notebook:](http://en.wikipedia.org/wiki/Facade_pattern) * [FluentInterface](Structural/FluentInterface) [:notebook:](http://en.wikipedia.org/wiki/Fluent_interface) +* [Flyweight](Structural/Flyweight) [:notebook:](https://en.wikipedia.org/wiki/Flyweight_pattern) * [Proxy](Structural/Proxy) [:notebook:](http://en.wikipedia.org/wiki/Proxy_pattern) * [Registry](Structural/Registry) [:notebook:](http://en.wikipedia.org/wiki/Service_locator_pattern) diff --git a/README.rst b/README.rst index 3db54a9..bc32f77 100644 --- a/README.rst +++ b/README.rst @@ -45,7 +45,7 @@ License (The MIT License) -Copyright (c) 2014 `Dominik Liebler`_ and `contributors`_ +Copyright (c) 2011 - 2016 `Dominik Liebler`_ and `contributors`_ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/Structural/Flyweight/README.rst b/Structural/Flyweight/README.rst index 322ebad..dec239b 100644 --- a/Structural/Flyweight/README.rst +++ b/Structural/Flyweight/README.rst @@ -1,5 +1,5 @@ `Flyweight`__ -========== +============= Purpose ------- diff --git a/Structural/README.md b/Structural/README.md index 6def831..40f2c10 100644 --- a/Structural/README.md +++ b/Structural/README.md @@ -12,5 +12,6 @@ entities. * [DependencyInjection](DependencyInjection) [:notebook:](http://en.wikipedia.org/wiki/Dependency_injection) * [Facade](Facade) [:notebook:](http://en.wikipedia.org/wiki/Facade_pattern) * [FluentInterface](FluentInterface) [:notebook:](http://en.wikipedia.org/wiki/Fluent_interface) +* [Flyweight](Flyweight) [:notebook:](https://en.wikipedia.org/wiki/Flyweight_pattern) * [Proxy](Proxy) [:notebook:](http://en.wikipedia.org/wiki/Proxy_pattern) * [Registry](Registry) [:notebook:](http://en.wikipedia.org/wiki/Service_locator_pattern) diff --git a/Structural/README.rst b/Structural/README.rst index fcf7c58..8715963 100644 --- a/Structural/README.rst +++ b/Structural/README.rst @@ -16,6 +16,7 @@ relationships between entities. DependencyInjection/README Facade/README FluentInterface/README + Flyweight/README Proxy/README Registry/README diff --git a/locale/ca/LC_MESSAGES/Behavioral/Mediator/README.po b/locale/ca/LC_MESSAGES/Behavioral/Mediator/README.po index 9c6694b..6474cd1 100644 --- a/locale/ca/LC_MESSAGES/Behavioral/Mediator/README.po +++ b/locale/ca/LC_MESSAGES/Behavioral/Mediator/README.po @@ -21,8 +21,8 @@ msgstr "" #: ../../Behavioral/Mediator/README.rst:7 msgid "" -"This pattern provides an easy to decouple many components working together. " -"It is a good alternative over Observer IF you have a \"central " +"This pattern provides an easy way to decouple many components working " +"together. It is a good alternative to Observer IF you have a \"central " "intelligence\", like a controller (but not in the sense of the MVC)." msgstr "" diff --git a/locale/ca/LC_MESSAGES/Behavioral/Memento/README.po b/locale/ca/LC_MESSAGES/Behavioral/Memento/README.po index 913069a..e92a849 100644 --- a/locale/ca/LC_MESSAGES/Behavioral/Memento/README.po +++ b/locale/ca/LC_MESSAGES/Behavioral/Memento/README.po @@ -1,15 +1,22 @@ -# +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" #: ../../Behavioral/Memento/README.rst:2 msgid "`Memento`__" @@ -21,65 +28,97 @@ msgstr "" #: ../../Behavioral/Memento/README.rst:7 msgid "" -"Provide the ability to restore an object to its previous state (undo via " -"rollback)." +"It provides the ability to restore an object to it's previous state (undo" +" via rollback) or to gain access to state of the object, without " +"revealing it's implementation (i.e., the object is not required to have a" +" functional for return the current state)." msgstr "" -#: ../../Behavioral/Memento/README.rst:10 +#: ../../Behavioral/Memento/README.rst:12 msgid "" -"The memento pattern is implemented with three objects: the originator, a " -"caretaker and a memento. The originator is some object that has an internal " -"state. The caretaker is going to do something to the originator, but wants " -"to be able to undo the change. The caretaker first asks the originator for a" -" memento object. Then it does whatever operation (or sequence of operations)" -" it was going to do. To roll back to the state before the operations, it " -"returns the memento object to the originator. The memento object itself is " -"an opaque object (one which the caretaker cannot, or should not, change). " -"When using this pattern, care should be taken if the originator may change " -"other objects or resources - the memento pattern operates on a single " -"object." +"The memento pattern is implemented with three objects: the Originator, a " +"Caretaker and a Memento." msgstr "" -#: ../../Behavioral/Memento/README.rst:23 +#: ../../Behavioral/Memento/README.rst:15 +msgid "" +"Memento – an object that *contains a concrete unique snapshot of state* " +"of any object or resource: string, number, array, an instance of class " +"and so on. The uniqueness in this case does not imply the prohibition " +"existence of similar states in different snapshots. That means the state " +"can be extracted as the independent clone. Any object stored in the " +"Memento should be *a full copy of the original object rather than a " +"reference* to the original object. The Memento object is a \"opaque " +"object\" (the object that no one can or should change)." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:24 +msgid "" +"Originator – it is an object that contains the *actual state of an " +"external object is strictly specified type*. Originator is able to create" +" a unique copy of this state and return it wrapped in a Memento. The " +"Originator does not know the history of changes. You can set a concrete " +"state to Originator from the outside, which will be considered as actual." +" The Originator must make sure that given state corresponds the allowed " +"type of object. Originator may (but not should) have any methods, but " +"they *they can't make changes to the saved object state*." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:33 +msgid "" +"Caretaker *controls the states history*. He may make changes to an " +"object; take a decision to save the state of an external object in the " +"Originator; ask from the Originator snapshot of the current state; or set" +" the Originator state to equivalence with some snapshot from history." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:39 msgid "Examples" msgstr "" -#: ../../Behavioral/Memento/README.rst:25 +#: ../../Behavioral/Memento/README.rst:41 msgid "The seed of a pseudorandom number generator" msgstr "" -#: ../../Behavioral/Memento/README.rst:26 +#: ../../Behavioral/Memento/README.rst:42 msgid "The state in a finite state machine" msgstr "" -#: ../../Behavioral/Memento/README.rst:29 -msgid "UML Diagram" -msgstr "" - -#: ../../Behavioral/Memento/README.rst:36 -msgid "Code" -msgstr "" - -#: ../../Behavioral/Memento/README.rst:38 -msgid "You can also find these code on `GitHub`_" -msgstr "" - -#: ../../Behavioral/Memento/README.rst:40 -msgid "Memento.php" +#: ../../Behavioral/Memento/README.rst:43 +msgid "" +"Control for intermediate states of `ORM Model " +"`_ before saving" msgstr "" #: ../../Behavioral/Memento/README.rst:46 +msgid "UML Diagram" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:53 +msgid "Code" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:55 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:57 +msgid "Memento.php" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:63 msgid "Originator.php" msgstr "" -#: ../../Behavioral/Memento/README.rst:52 +#: ../../Behavioral/Memento/README.rst:69 msgid "Caretaker.php" msgstr "" -#: ../../Behavioral/Memento/README.rst:59 +#: ../../Behavioral/Memento/README.rst:76 msgid "Test" msgstr "" -#: ../../Behavioral/Memento/README.rst:61 +#: ../../Behavioral/Memento/README.rst:78 msgid "Tests/MementoTest.php" msgstr "" + diff --git a/locale/ca/LC_MESSAGES/More/Delegation/README.po b/locale/ca/LC_MESSAGES/More/Delegation/README.po index 169e8fd..ac259f0 100644 --- a/locale/ca/LC_MESSAGES/More/Delegation/README.po +++ b/locale/ca/LC_MESSAGES/More/Delegation/README.po @@ -1,15 +1,22 @@ -# +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" #: ../../More/Delegation/README.rst:2 msgid "`Delegation`__" @@ -19,14 +26,26 @@ msgstr "" msgid "Purpose" msgstr "" -#: ../../More/Delegation/README.rst:7 ../../More/Delegation/README.rst:12 -msgid "..." +#: ../../More/Delegation/README.rst:7 +msgid "" +"Demonstrate the Delegator pattern, where an object, instead of performing" +" one of its stated tasks, delegates that task to an associated helper " +"object. In this case TeamLead professes to writeCode and Usage uses this," +" while TeamLead delegates writeCode to JuniorDeveloper's writeBadCode " +"function. This inverts the responsibility so that Usage is unknowingly " +"executing writeBadCode." msgstr "" #: ../../More/Delegation/README.rst:10 msgid "Examples" msgstr "" +#: ../../More/Delegation/README.rst:12 +msgid "" +"Please review JuniorDeveloper.php, TeamLead.php, and then Usage.php to " +"see it all tied together." +msgstr "" + #: ../../More/Delegation/README.rst:15 msgid "UML Diagram" msgstr "" @@ -58,3 +77,4 @@ msgstr "" #: ../../More/Delegation/README.rst:47 msgid "Tests/DelegationTest.php" msgstr "" + diff --git a/locale/ca/LC_MESSAGES/More/EAV/README.po b/locale/ca/LC_MESSAGES/More/EAV/README.po new file mode 100644 index 0000000..c101913 --- /dev/null +++ b/locale/ca/LC_MESSAGES/More/EAV/README.po @@ -0,0 +1,78 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: ../../More/EAV/README.rst:2 +msgid "`Entity-Attribute-Value (EAV)`__" +msgstr "" + +#: ../../More/EAV/README.rst:4 +msgid "" +"The Entity–attribute–value (EAV) pattern in order to implement EAV model " +"with PHP." +msgstr "" + +#: ../../More/EAV/README.rst:7 +msgid "Purpose" +msgstr "" + +#: ../../More/EAV/README.rst:9 +msgid "" +"The Entity–attribute–value (EAV) model is a data model to describe " +"entities where the number of attributes (properties, parameters) that can" +" be used to describe them is potentially vast, but the number that will " +"actually apply to a given entity is relatively modest." +msgstr "" + +#: ../../More/EAV/README.rst:15 +msgid "Examples" +msgstr "" + +#: ../../More/EAV/README.rst:17 +msgid "Check full work example in `example.php`_ file." +msgstr "" + +#: ../../More/EAV/README.rst:90 +msgid "UML Diagram" +msgstr "" + +#: ../../More/EAV/README.rst:97 +msgid "Code" +msgstr "" + +#: ../../More/EAV/README.rst:99 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../More/EAV/README.rst:102 +msgid "Test" +msgstr "" + +#: ../../More/EAV/README.rst:104 +msgid "Tests/EntityTest.php" +msgstr "" + +#: ../../More/EAV/README.rst:110 +msgid "Tests/AttributeTest.php" +msgstr "" + +#: ../../More/EAV/README.rst:116 +msgid "Tests/ValueTest.php" +msgstr "" + diff --git a/locale/ca/LC_MESSAGES/README.po b/locale/ca/LC_MESSAGES/README.po index 3a26db2..8588590 100644 --- a/locale/ca/LC_MESSAGES/README.po +++ b/locale/ca/LC_MESSAGES/README.po @@ -62,7 +62,7 @@ msgid "(The MIT License)" msgstr "" #: ../../README.rst:48 -msgid "Copyright (c) 2014 `Dominik Liebler`_ and `contributors`_" +msgid "Copyright (c) 2011 - 2016 `Dominik Liebler`_ and `contributors`_" msgstr "" #: ../../README.rst:50 diff --git a/locale/ca/LC_MESSAGES/Structural/Flyweight/README.po b/locale/ca/LC_MESSAGES/Structural/Flyweight/README.po new file mode 100644 index 0000000..9a8b771 --- /dev/null +++ b/locale/ca/LC_MESSAGES/Structural/Flyweight/README.po @@ -0,0 +1,69 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: ../../Structural/Flyweight/README.rst:2 +msgid "`Flyweight`__" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:5 +msgid "Purpose" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:7 +msgid "" +"To minimise memory usage, a Flyweight shares as much as possible memory " +"with similar objects. It is needed when a large amount of objects is used" +" that don't differ much in state. A common practice is to hold state in " +"external data structures and pass them to the flyweight object when " +"needed." +msgstr "" + +#: ../../Structural/Flyweight/README.rst:12 +msgid "UML Diagram" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:19 +msgid "Code" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:21 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:23 +msgid "FlyweightInterface.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:29 +msgid "CharacterFlyweight.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:35 +msgid "FlyweightFactory.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:42 +msgid "Test" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:44 +msgid "Tests/FlyweightTest.php" +msgstr "" + diff --git a/locale/ca/LC_MESSAGES/Structural/Registry/README.po b/locale/ca/LC_MESSAGES/Structural/Registry/README.po index 843138c..ddc6079 100644 --- a/locale/ca/LC_MESSAGES/Structural/Registry/README.po +++ b/locale/ca/LC_MESSAGES/Structural/Registry/README.po @@ -32,8 +32,8 @@ msgstr "" #: ../../Structural/Registry/README.rst:14 msgid "" -"Zend Framework: ``Zend_Registry`` holds the application's logger object, " -"front controller etc." +"Zend Framework 1: ``Zend_Registry`` holds the application's logger " +"object, front controller etc." msgstr "" #: ../../Structural/Registry/README.rst:16 diff --git a/locale/de/LC_MESSAGES/Behavioral/Mediator/README.po b/locale/de/LC_MESSAGES/Behavioral/Mediator/README.po index 7735326..bd3e76a 100644 --- a/locale/de/LC_MESSAGES/Behavioral/Mediator/README.po +++ b/locale/de/LC_MESSAGES/Behavioral/Mediator/README.po @@ -23,9 +23,9 @@ msgstr "Zweck" #: ../../Behavioral/Mediator/README.rst:7 msgid "" -"This pattern provides an easy to decouple many components working together. It is a good " -"alternative over Observer IF you have a \"central intelligence\", like a controller (but not in the " -"sense of the MVC)." +"This pattern provides an easy way to decouple many components working " +"together. It is a good alternative to Observer IF you have a \"central " +"intelligence\", like a controller (but not in the sense of the MVC)." msgstr "" "Dieses Muster bietet eine einfache Möglichkeit, viele, miteinander arbeitende Komponenten zu " "entkoppeln. Es ist eine gute Alternative für das Observer-Pattern, wenn du eine „zentrale " diff --git a/locale/de/LC_MESSAGES/Behavioral/Memento/README.po b/locale/de/LC_MESSAGES/Behavioral/Memento/README.po index 9bbe94b..aa8752f 100644 --- a/locale/de/LC_MESSAGES/Behavioral/Memento/README.po +++ b/locale/de/LC_MESSAGES/Behavioral/Memento/README.po @@ -1,100 +1,225 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. # +#, fuzzy msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2016-04-03 12:52+0200\n" -"Last-Translator: Dominik Liebler \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Language-Team: \n" -"X-Generator: Poedit 1.8.7\n" +"Generated-By: Babel 2.3.4\n" #: ../../Behavioral/Memento/README.rst:2 msgid "`Memento`__" -msgstr "`Memento`__" +msgstr "" #: ../../Behavioral/Memento/README.rst:5 msgid "Purpose" -msgstr "Zweck" +msgstr "" #: ../../Behavioral/Memento/README.rst:7 msgid "" -"Provide the ability to restore an object to its previous state (undo via " -"rollback)." +"It provides the ability to restore an object to it's previous state (undo" +" via rollback) or to gain access to state of the object, without " +"revealing it's implementation (i.e., the object is not required to have a" +" functional for return the current state)." msgstr "" -"Bietet die Möglichkeit, einen Objektzustand zu einem vorigen Zustand " -"zurückzusetzen (mit Hilfe eines Rollbacks)." -#: ../../Behavioral/Memento/README.rst:10 +#: ../../Behavioral/Memento/README.rst:12 msgid "" -"The memento pattern is implemented with three objects: the originator, a " -"caretaker and a memento. The originator is some object that has an internal " -"state. The caretaker is going to do something to the originator, but wants to " -"be able to undo the change. The caretaker first asks the originator for a " -"memento object. Then it does whatever operation (or sequence of operations) it " -"was going to do. To roll back to the state before the operations, it returns " -"the memento object to the originator. The memento object itself is an opaque " -"object (one which the caretaker cannot, or should not, change). When using " -"this pattern, care should be taken if the originator may change other objects " -"or resources - the memento pattern operates on a single object." +"The memento pattern is implemented with three objects: the Originator, a " +"Caretaker and a Memento." msgstr "" -"Das Memento-Muster wird mit Hilfe von drei Objekten implementiert: der " -"Originalton, ein Caretaker und das Memento. Der Originalton ist ein Objekt, " -"das einen internen State besitzt. Der Caretaker wird etwas mit dem Originalton " -"machen, aber möchte evtl. diese Änderung auch rückgängig machen wollen. Der " -"Caretaker fragt den Originalton zuerst nach dem Memento-Objekt. Dann wird die " -"angefragte Operation (oder Sequenz von Änderungen) ausgeführt. Um diese " -"Änderung zurückzurollen, wird das Memento-Objekt an den Originalton " -"zurückgegeben. Das Memento-Objekt selbst ist intransparent, so dass der " -"Caretaker selbstständig keine Änderungen am Objekt durchführen kann. Bei der " -"Implementierung dieses Musters ist darauf zu achten, dass der Originator auch " -"Seiteneffekte auslösen kann, das Pattern aber nur auf einem einzelnen Objekt " -"operiert." -#: ../../Behavioral/Memento/README.rst:23 +#: ../../Behavioral/Memento/README.rst:15 +msgid "" +"Memento – an object that *contains a concrete unique snapshot of state* " +"of any object or resource: string, number, array, an instance of class " +"and so on. The uniqueness in this case does not imply the prohibition " +"existence of similar states in different snapshots. That means the state " +"can be extracted as the independent clone. Any object stored in the " +"Memento should be *a full copy of the original object rather than a " +"reference* to the original object. The Memento object is a \"opaque " +"object\" (the object that no one can or should change)." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:24 +msgid "" +"Originator – it is an object that contains the *actual state of an " +"external object is strictly specified type*. Originator is able to create" +" a unique copy of this state and return it wrapped in a Memento. The " +"Originator does not know the history of changes. You can set a concrete " +"state to Originator from the outside, which will be considered as actual." +" The Originator must make sure that given state corresponds the allowed " +"type of object. Originator may (but not should) have any methods, but " +"they *they can't make changes to the saved object state*." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:33 +msgid "" +"Caretaker *controls the states history*. He may make changes to an " +"object; take a decision to save the state of an external object in the " +"Originator; ask from the Originator snapshot of the current state; or set" +" the Originator state to equivalence with some snapshot from history." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:39 msgid "Examples" -msgstr "Beispiele" +msgstr "" -#: ../../Behavioral/Memento/README.rst:25 +#: ../../Behavioral/Memento/README.rst:41 msgid "The seed of a pseudorandom number generator" -msgstr "Das seeden eines Pseudozufallszahlengenerators" +msgstr "" -#: ../../Behavioral/Memento/README.rst:26 +#: ../../Behavioral/Memento/README.rst:42 msgid "The state in a finite state machine" -msgstr "Der State in einer FSM (Finite State Machine)" +msgstr "" -#: ../../Behavioral/Memento/README.rst:29 -msgid "UML Diagram" -msgstr "UML-Diagramm" - -#: ../../Behavioral/Memento/README.rst:36 -msgid "Code" -msgstr "Code" - -#: ../../Behavioral/Memento/README.rst:38 -msgid "You can also find these code on `GitHub`_" -msgstr "Du findest den Code hierzu auf `GitHub`_" - -#: ../../Behavioral/Memento/README.rst:40 -msgid "Memento.php" -msgstr "Memento.php" +#: ../../Behavioral/Memento/README.rst:43 +msgid "" +"Control for intermediate states of `ORM Model " +"`_ before saving" +msgstr "" #: ../../Behavioral/Memento/README.rst:46 +msgid "UML Diagram" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:53 +msgid "Code" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:55 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:57 +msgid "Memento.php" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:63 msgid "Originator.php" -msgstr "Originator.php" +msgstr "" -#: ../../Behavioral/Memento/README.rst:52 +#: ../../Behavioral/Memento/README.rst:69 msgid "Caretaker.php" -msgstr "Caretaker.php" +msgstr "" -#: ../../Behavioral/Memento/README.rst:59 +#: ../../Behavioral/Memento/README.rst:76 msgid "Test" -msgstr "Test" +msgstr "" -#: ../../Behavioral/Memento/README.rst:61 +#: ../../Behavioral/Memento/README.rst:78 msgid "Tests/MementoTest.php" -msgstr "Tests/MementoTest.php" +msgstr "" + + +#. # +#. msgid "" +#. msgstr "" +#. "Project-Id-Version: DesignPatternsPHP 1.0\n" +#. "Report-Msgid-Bugs-To: \n" +#. "POT-Creation-Date: 2015-05-29 12:18+0200\n" +#. "PO-Revision-Date: 2016-04-03 12:52+0200\n" +#. "Last-Translator: Dominik Liebler \n" +#. "MIME-Version: 1.0\n" +#. "Content-Type: text/plain; charset=UTF-8\n" +#. "Content-Transfer-Encoding: 8bit\n" +#. "Language: de\n" +#. "Language-Team: \n" +#. "X-Generator: Poedit 1.8.7\n" +#. +#. #: ../../Behavioral/Memento/README.rst:2 +#. msgid "`Memento`__" +#. msgstr "`Memento`__" +#. +#. #: ../../Behavioral/Memento/README.rst:5 +#. msgid "Purpose" +#. msgstr "Zweck" +#. +#. #: ../../Behavioral/Memento/README.rst:7 +#. msgid "" +#. "Provide the ability to restore an object to its previous state (undo via " +#. "rollback)." +#. msgstr "" +#. "Bietet die Möglichkeit, einen Objektzustand zu einem vorigen Zustand " +#. "zurückzusetzen (mit Hilfe eines Rollbacks)." +#. +#. #: ../../Behavioral/Memento/README.rst:10 +#. msgid "" +#. "The memento pattern is implemented with three objects: the originator, a " +#. "caretaker and a memento. The originator is some object that has an internal " +#. "state. The caretaker is going to do something to the originator, but wants to " +#. "be able to undo the change. The caretaker first asks the originator for a " +#. "memento object. Then it does whatever operation (or sequence of operations) it " +#. "was going to do. To roll back to the state before the operations, it returns " +#. "the memento object to the originator. The memento object itself is an opaque " +#. "object (one which the caretaker cannot, or should not, change). When using " +#. "this pattern, care should be taken if the originator may change other objects " +#. "or resources - the memento pattern operates on a single object." +#. msgstr "" +#. "Das Memento-Muster wird mit Hilfe von drei Objekten implementiert: der " +#. "Originalton, ein Caretaker und das Memento. Der Originalton ist ein Objekt, " +#. "das einen internen State besitzt. Der Caretaker wird etwas mit dem Originalton " +#. "machen, aber möchte evtl. diese Änderung auch rückgängig machen wollen. Der " +#. "Caretaker fragt den Originalton zuerst nach dem Memento-Objekt. Dann wird die " +#. "angefragte Operation (oder Sequenz von Änderungen) ausgeführt. Um diese " +#. "Änderung zurückzurollen, wird das Memento-Objekt an den Originalton " +#. "zurückgegeben. Das Memento-Objekt selbst ist intransparent, so dass der " +#. "Caretaker selbstständig keine Änderungen am Objekt durchführen kann. Bei der " +#. "Implementierung dieses Musters ist darauf zu achten, dass der Originator auch " +#. "Seiteneffekte auslösen kann, das Pattern aber nur auf einem einzelnen Objekt " +#. "operiert." +#. +#. #: ../../Behavioral/Memento/README.rst:23 +#. msgid "Examples" +#. msgstr "Beispiele" +#. +#. #: ../../Behavioral/Memento/README.rst:25 +#. msgid "The seed of a pseudorandom number generator" +#. msgstr "Das seeden eines Pseudozufallszahlengenerators" +#. +#. #: ../../Behavioral/Memento/README.rst:26 +#. msgid "The state in a finite state machine" +#. msgstr "Der State in einer FSM (Finite State Machine)" +#. +#. #: ../../Behavioral/Memento/README.rst:29 +#. msgid "UML Diagram" +#. msgstr "UML-Diagramm" +#. +#. #: ../../Behavioral/Memento/README.rst:36 +#. msgid "Code" +#. msgstr "Code" +#. +#. #: ../../Behavioral/Memento/README.rst:38 +#. msgid "You can also find these code on `GitHub`_" +#. msgstr "Du findest den Code hierzu auf `GitHub`_" +#. +#. #: ../../Behavioral/Memento/README.rst:40 +#. msgid "Memento.php" +#. msgstr "Memento.php" +#. +#. #: ../../Behavioral/Memento/README.rst:46 +#. msgid "Originator.php" +#. msgstr "Originator.php" +#. +#. #: ../../Behavioral/Memento/README.rst:52 +#. msgid "Caretaker.php" +#. msgstr "Caretaker.php" +#. +#. #: ../../Behavioral/Memento/README.rst:59 +#. msgid "Test" +#. msgstr "Test" +#. +#. #: ../../Behavioral/Memento/README.rst:61 +#. msgid "Tests/MementoTest.php" +#. msgstr "Tests/MementoTest.php" diff --git a/locale/de/LC_MESSAGES/More/Delegation/README.po b/locale/de/LC_MESSAGES/More/Delegation/README.po index be8af51..ac259f0 100644 --- a/locale/de/LC_MESSAGES/More/Delegation/README.po +++ b/locale/de/LC_MESSAGES/More/Delegation/README.po @@ -1,62 +1,80 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. # +#, fuzzy msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2016-04-04 08:05+0200\n" -"Last-Translator: Dominik Liebler \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Language-Team: \n" -"X-Generator: Poedit 1.8.7.1\n" +"Generated-By: Babel 2.3.4\n" #: ../../More/Delegation/README.rst:2 msgid "`Delegation`__" -msgstr "`Delegation`__" +msgstr "" #: ../../More/Delegation/README.rst:5 msgid "Purpose" -msgstr "Zweck" +msgstr "" -#: ../../More/Delegation/README.rst:7 ../../More/Delegation/README.rst:12 -msgid "..." -msgstr "..." +#: ../../More/Delegation/README.rst:7 +msgid "" +"Demonstrate the Delegator pattern, where an object, instead of performing" +" one of its stated tasks, delegates that task to an associated helper " +"object. In this case TeamLead professes to writeCode and Usage uses this," +" while TeamLead delegates writeCode to JuniorDeveloper's writeBadCode " +"function. This inverts the responsibility so that Usage is unknowingly " +"executing writeBadCode." +msgstr "" #: ../../More/Delegation/README.rst:10 msgid "Examples" -msgstr "Beispiele" +msgstr "" + +#: ../../More/Delegation/README.rst:12 +msgid "" +"Please review JuniorDeveloper.php, TeamLead.php, and then Usage.php to " +"see it all tied together." +msgstr "" #: ../../More/Delegation/README.rst:15 msgid "UML Diagram" -msgstr "UML Diagramm" +msgstr "" #: ../../More/Delegation/README.rst:22 msgid "Code" -msgstr "Code" +msgstr "" #: ../../More/Delegation/README.rst:24 msgid "You can also find these code on `GitHub`_" -msgstr "Du findest den Code auch auf `GitHub`_" +msgstr "" #: ../../More/Delegation/README.rst:26 msgid "Usage.php" -msgstr "Usage.php" +msgstr "" #: ../../More/Delegation/README.rst:32 msgid "TeamLead.php" -msgstr "TeamLead.php" +msgstr "" #: ../../More/Delegation/README.rst:38 msgid "JuniorDeveloper.php" -msgstr "JuniorDeveloper.php" +msgstr "" #: ../../More/Delegation/README.rst:45 msgid "Test" -msgstr "Теst" +msgstr "" #: ../../More/Delegation/README.rst:47 msgid "Tests/DelegationTest.php" -msgstr "Tests/DelegationTest.php" +msgstr "" + diff --git a/locale/de/LC_MESSAGES/More/EAV/README.po b/locale/de/LC_MESSAGES/More/EAV/README.po new file mode 100644 index 0000000..c101913 --- /dev/null +++ b/locale/de/LC_MESSAGES/More/EAV/README.po @@ -0,0 +1,78 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: ../../More/EAV/README.rst:2 +msgid "`Entity-Attribute-Value (EAV)`__" +msgstr "" + +#: ../../More/EAV/README.rst:4 +msgid "" +"The Entity–attribute–value (EAV) pattern in order to implement EAV model " +"with PHP." +msgstr "" + +#: ../../More/EAV/README.rst:7 +msgid "Purpose" +msgstr "" + +#: ../../More/EAV/README.rst:9 +msgid "" +"The Entity–attribute–value (EAV) model is a data model to describe " +"entities where the number of attributes (properties, parameters) that can" +" be used to describe them is potentially vast, but the number that will " +"actually apply to a given entity is relatively modest." +msgstr "" + +#: ../../More/EAV/README.rst:15 +msgid "Examples" +msgstr "" + +#: ../../More/EAV/README.rst:17 +msgid "Check full work example in `example.php`_ file." +msgstr "" + +#: ../../More/EAV/README.rst:90 +msgid "UML Diagram" +msgstr "" + +#: ../../More/EAV/README.rst:97 +msgid "Code" +msgstr "" + +#: ../../More/EAV/README.rst:99 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../More/EAV/README.rst:102 +msgid "Test" +msgstr "" + +#: ../../More/EAV/README.rst:104 +msgid "Tests/EntityTest.php" +msgstr "" + +#: ../../More/EAV/README.rst:110 +msgid "Tests/AttributeTest.php" +msgstr "" + +#: ../../More/EAV/README.rst:116 +msgid "Tests/ValueTest.php" +msgstr "" + diff --git a/locale/de/LC_MESSAGES/README.po b/locale/de/LC_MESSAGES/README.po index 3eb7c9c..3cd8baa 100644 --- a/locale/de/LC_MESSAGES/README.po +++ b/locale/de/LC_MESSAGES/README.po @@ -67,8 +67,8 @@ msgid "(The MIT License)" msgstr "(The MIT License)" #: ../../README.rst:48 -msgid "Copyright (c) 2014 `Dominik Liebler`_ and `contributors`_" -msgstr "Copyright (c) 2014 `Dominik Liebler`_ and `contributors`_" +msgid "Copyright (c) 2011 - 2016 `Dominik Liebler`_ and `contributors`_" +msgstr "Copyright (c) 2011 - 2016 `Dominik Liebler`_ and `contributors`_" #: ../../README.rst:50 msgid "" diff --git a/locale/de/LC_MESSAGES/Structural/Flyweight/README.po b/locale/de/LC_MESSAGES/Structural/Flyweight/README.po new file mode 100644 index 0000000..9a8b771 --- /dev/null +++ b/locale/de/LC_MESSAGES/Structural/Flyweight/README.po @@ -0,0 +1,69 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: ../../Structural/Flyweight/README.rst:2 +msgid "`Flyweight`__" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:5 +msgid "Purpose" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:7 +msgid "" +"To minimise memory usage, a Flyweight shares as much as possible memory " +"with similar objects. It is needed when a large amount of objects is used" +" that don't differ much in state. A common practice is to hold state in " +"external data structures and pass them to the flyweight object when " +"needed." +msgstr "" + +#: ../../Structural/Flyweight/README.rst:12 +msgid "UML Diagram" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:19 +msgid "Code" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:21 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:23 +msgid "FlyweightInterface.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:29 +msgid "CharacterFlyweight.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:35 +msgid "FlyweightFactory.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:42 +msgid "Test" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:44 +msgid "Tests/FlyweightTest.php" +msgstr "" + diff --git a/locale/de/LC_MESSAGES/Structural/Registry/README.po b/locale/de/LC_MESSAGES/Structural/Registry/README.po index b890133..648c0aa 100644 --- a/locale/de/LC_MESSAGES/Structural/Registry/README.po +++ b/locale/de/LC_MESSAGES/Structural/Registry/README.po @@ -38,10 +38,10 @@ msgstr "Beispiele" #: ../../Structural/Registry/README.rst:14 msgid "" -"Zend Framework: ``Zend_Registry`` holds the application's logger object, " -"front controller etc." +"Zend Framework 1: ``Zend_Registry`` holds the application's logger " +"object, front controller etc." msgstr "" -"Zend Framework: ``Zend_Registry`` hält die zentralen Objekte der " +"Zend Framework 1: ``Zend_Registry`` hält die zentralen Objekte der " "Anwendung: z.B. Logger oder Front Controller" #: ../../Structural/Registry/README.rst:16 diff --git a/locale/es/LC_MESSAGES/Behavioral/Mediator/README.po b/locale/es/LC_MESSAGES/Behavioral/Mediator/README.po index 9c6694b..6474cd1 100644 --- a/locale/es/LC_MESSAGES/Behavioral/Mediator/README.po +++ b/locale/es/LC_MESSAGES/Behavioral/Mediator/README.po @@ -21,8 +21,8 @@ msgstr "" #: ../../Behavioral/Mediator/README.rst:7 msgid "" -"This pattern provides an easy to decouple many components working together. " -"It is a good alternative over Observer IF you have a \"central " +"This pattern provides an easy way to decouple many components working " +"together. It is a good alternative to Observer IF you have a \"central " "intelligence\", like a controller (but not in the sense of the MVC)." msgstr "" diff --git a/locale/es/LC_MESSAGES/Behavioral/Memento/README.po b/locale/es/LC_MESSAGES/Behavioral/Memento/README.po index 913069a..9aa14bc 100644 --- a/locale/es/LC_MESSAGES/Behavioral/Memento/README.po +++ b/locale/es/LC_MESSAGES/Behavioral/Memento/README.po @@ -1,15 +1,22 @@ -# +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" #: ../../Behavioral/Memento/README.rst:2 msgid "`Memento`__" @@ -21,65 +28,184 @@ msgstr "" #: ../../Behavioral/Memento/README.rst:7 msgid "" -"Provide the ability to restore an object to its previous state (undo via " -"rollback)." +"It provides the ability to restore an object to it's previous state (undo" +" via rollback) or to gain access to state of the object, without " +"revealing it's implementation (i.e., the object is not required to have a" +" functional for return the current state)." msgstr "" -#: ../../Behavioral/Memento/README.rst:10 +#: ../../Behavioral/Memento/README.rst:12 msgid "" -"The memento pattern is implemented with three objects: the originator, a " -"caretaker and a memento. The originator is some object that has an internal " -"state. The caretaker is going to do something to the originator, but wants " -"to be able to undo the change. The caretaker first asks the originator for a" -" memento object. Then it does whatever operation (or sequence of operations)" -" it was going to do. To roll back to the state before the operations, it " -"returns the memento object to the originator. The memento object itself is " -"an opaque object (one which the caretaker cannot, or should not, change). " -"When using this pattern, care should be taken if the originator may change " -"other objects or resources - the memento pattern operates on a single " -"object." +"The memento pattern is implemented with three objects: the Originator, a " +"Caretaker and a Memento." msgstr "" -#: ../../Behavioral/Memento/README.rst:23 +#: ../../Behavioral/Memento/README.rst:15 +msgid "" +"Memento – an object that *contains a concrete unique snapshot of state* " +"of any object or resource: string, number, array, an instance of class " +"and so on. The uniqueness in this case does not imply the prohibition " +"existence of similar states in different snapshots. That means the state " +"can be extracted as the independent clone. Any object stored in the " +"Memento should be *a full copy of the original object rather than a " +"reference* to the original object. The Memento object is a \"opaque " +"object\" (the object that no one can or should change)." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:24 +msgid "" +"Originator – it is an object that contains the *actual state of an " +"external object is strictly specified type*. Originator is able to create" +" a unique copy of this state and return it wrapped in a Memento. The " +"Originator does not know the history of changes. You can set a concrete " +"state to Originator from the outside, which will be considered as actual." +" The Originator must make sure that given state corresponds the allowed " +"type of object. Originator may (but not should) have any methods, but " +"they *they can't make changes to the saved object state*." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:33 +msgid "" +"Caretaker *controls the states history*. He may make changes to an " +"object; take a decision to save the state of an external object in the " +"Originator; ask from the Originator snapshot of the current state; or set" +" the Originator state to equivalence with some snapshot from history." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:39 msgid "Examples" msgstr "" -#: ../../Behavioral/Memento/README.rst:25 +#: ../../Behavioral/Memento/README.rst:41 msgid "The seed of a pseudorandom number generator" msgstr "" -#: ../../Behavioral/Memento/README.rst:26 +#: ../../Behavioral/Memento/README.rst:42 msgid "The state in a finite state machine" msgstr "" -#: ../../Behavioral/Memento/README.rst:29 -msgid "UML Diagram" -msgstr "" - -#: ../../Behavioral/Memento/README.rst:36 -msgid "Code" -msgstr "" - -#: ../../Behavioral/Memento/README.rst:38 -msgid "You can also find these code on `GitHub`_" -msgstr "" - -#: ../../Behavioral/Memento/README.rst:40 -msgid "Memento.php" +#: ../../Behavioral/Memento/README.rst:43 +msgid "" +"Control for intermediate states of `ORM Model " +"`_ before saving" msgstr "" #: ../../Behavioral/Memento/README.rst:46 +msgid "UML Diagram" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:53 +msgid "Code" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:55 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:57 +msgid "Memento.php" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:63 msgid "Originator.php" msgstr "" -#: ../../Behavioral/Memento/README.rst:52 +#: ../../Behavioral/Memento/README.rst:69 msgid "Caretaker.php" msgstr "" -#: ../../Behavioral/Memento/README.rst:59 +#: ../../Behavioral/Memento/README.rst:76 msgid "Test" msgstr "" -#: ../../Behavioral/Memento/README.rst:61 +#: ../../Behavioral/Memento/README.rst:78 msgid "Tests/MementoTest.php" msgstr "" + + + +#. # +#. msgid "" +#. msgstr "" +#. "Project-Id-Version: DesignPatternsPHP 1.0\n" +#. "Report-Msgid-Bugs-To: \n" +#. "POT-Creation-Date: 2015-05-29 12:18+0200\n" +#. "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +#. "Last-Translator: FULL NAME \n" +#. "Language-Team: LANGUAGE \n" +#. "MIME-Version: 1.0\n" +#. "Content-Type: text/plain; charset=UTF-8\n" +#. "Content-Transfer-Encoding: 8bit\n" +#. +#. #: ../../Behavioral/Memento/README.rst:2 +#. msgid "`Memento`__" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:5 +#. msgid "Purpose" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:7 +#. msgid "" +#. "Provide the ability to restore an object to its previous state (undo via " +#. "rollback)." +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:10 +#. msgid "" +#. "The memento pattern is implemented with three objects: the originator, a " +#. "caretaker and a memento. The originator is some object that has an internal " +#. "state. The caretaker is going to do something to the originator, but wants " +#. "to be able to undo the change. The caretaker first asks the originator for a" +#. " memento object. Then it does whatever operation (or sequence of operations)" +#. " it was going to do. To roll back to the state before the operations, it " +#. "returns the memento object to the originator. The memento object itself is " +#. "an opaque object (one which the caretaker cannot, or should not, change). " +#. "When using this pattern, care should be taken if the originator may change " +#. "other objects or resources - the memento pattern operates on a single " +#. "object." +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:23 +#. msgid "Examples" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:25 +#. msgid "The seed of a pseudorandom number generator" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:26 +#. msgid "The state in a finite state machine" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:29 +#. msgid "UML Diagram" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:36 +#. msgid "Code" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:38 +#. msgid "You can also find these code on `GitHub`_" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:40 +#. msgid "Memento.php" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:46 +#. msgid "Originator.php" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:52 +#. msgid "Caretaker.php" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:59 +#. msgid "Test" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:61 +#. msgid "Tests/MementoTest.php" +#. msgstr "" diff --git a/locale/es/LC_MESSAGES/More/Delegation/README.po b/locale/es/LC_MESSAGES/More/Delegation/README.po index 169e8fd..ac259f0 100644 --- a/locale/es/LC_MESSAGES/More/Delegation/README.po +++ b/locale/es/LC_MESSAGES/More/Delegation/README.po @@ -1,15 +1,22 @@ -# +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" #: ../../More/Delegation/README.rst:2 msgid "`Delegation`__" @@ -19,14 +26,26 @@ msgstr "" msgid "Purpose" msgstr "" -#: ../../More/Delegation/README.rst:7 ../../More/Delegation/README.rst:12 -msgid "..." +#: ../../More/Delegation/README.rst:7 +msgid "" +"Demonstrate the Delegator pattern, where an object, instead of performing" +" one of its stated tasks, delegates that task to an associated helper " +"object. In this case TeamLead professes to writeCode and Usage uses this," +" while TeamLead delegates writeCode to JuniorDeveloper's writeBadCode " +"function. This inverts the responsibility so that Usage is unknowingly " +"executing writeBadCode." msgstr "" #: ../../More/Delegation/README.rst:10 msgid "Examples" msgstr "" +#: ../../More/Delegation/README.rst:12 +msgid "" +"Please review JuniorDeveloper.php, TeamLead.php, and then Usage.php to " +"see it all tied together." +msgstr "" + #: ../../More/Delegation/README.rst:15 msgid "UML Diagram" msgstr "" @@ -58,3 +77,4 @@ msgstr "" #: ../../More/Delegation/README.rst:47 msgid "Tests/DelegationTest.php" msgstr "" + diff --git a/locale/es/LC_MESSAGES/More/EAV/README.po b/locale/es/LC_MESSAGES/More/EAV/README.po new file mode 100644 index 0000000..c101913 --- /dev/null +++ b/locale/es/LC_MESSAGES/More/EAV/README.po @@ -0,0 +1,78 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: ../../More/EAV/README.rst:2 +msgid "`Entity-Attribute-Value (EAV)`__" +msgstr "" + +#: ../../More/EAV/README.rst:4 +msgid "" +"The Entity–attribute–value (EAV) pattern in order to implement EAV model " +"with PHP." +msgstr "" + +#: ../../More/EAV/README.rst:7 +msgid "Purpose" +msgstr "" + +#: ../../More/EAV/README.rst:9 +msgid "" +"The Entity–attribute–value (EAV) model is a data model to describe " +"entities where the number of attributes (properties, parameters) that can" +" be used to describe them is potentially vast, but the number that will " +"actually apply to a given entity is relatively modest." +msgstr "" + +#: ../../More/EAV/README.rst:15 +msgid "Examples" +msgstr "" + +#: ../../More/EAV/README.rst:17 +msgid "Check full work example in `example.php`_ file." +msgstr "" + +#: ../../More/EAV/README.rst:90 +msgid "UML Diagram" +msgstr "" + +#: ../../More/EAV/README.rst:97 +msgid "Code" +msgstr "" + +#: ../../More/EAV/README.rst:99 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../More/EAV/README.rst:102 +msgid "Test" +msgstr "" + +#: ../../More/EAV/README.rst:104 +msgid "Tests/EntityTest.php" +msgstr "" + +#: ../../More/EAV/README.rst:110 +msgid "Tests/AttributeTest.php" +msgstr "" + +#: ../../More/EAV/README.rst:116 +msgid "Tests/ValueTest.php" +msgstr "" + diff --git a/locale/es/LC_MESSAGES/README.po b/locale/es/LC_MESSAGES/README.po index ddebaed..80021bb 100644 --- a/locale/es/LC_MESSAGES/README.po +++ b/locale/es/LC_MESSAGES/README.po @@ -77,8 +77,8 @@ msgid "(The MIT License)" msgstr "(La licencia MIT)" #: ../../README.rst:48 -msgid "Copyright (c) 2014 `Dominik Liebler`_ and `contributors`_" -msgstr "Copyright (c) 2014 `Dominik Liebler`_ and `contributors`_" +msgid "Copyright (c) 2011 - 2016 `Dominik Liebler`_ and `contributors`_" +msgstr "Copyright (c) 2011 - 2016 `Dominik Liebler`_ and `contributors`_" #: ../../README.rst:50 msgid "" diff --git a/locale/es/LC_MESSAGES/Structural/Flyweight/README.po b/locale/es/LC_MESSAGES/Structural/Flyweight/README.po new file mode 100644 index 0000000..9a8b771 --- /dev/null +++ b/locale/es/LC_MESSAGES/Structural/Flyweight/README.po @@ -0,0 +1,69 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: ../../Structural/Flyweight/README.rst:2 +msgid "`Flyweight`__" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:5 +msgid "Purpose" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:7 +msgid "" +"To minimise memory usage, a Flyweight shares as much as possible memory " +"with similar objects. It is needed when a large amount of objects is used" +" that don't differ much in state. A common practice is to hold state in " +"external data structures and pass them to the flyweight object when " +"needed." +msgstr "" + +#: ../../Structural/Flyweight/README.rst:12 +msgid "UML Diagram" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:19 +msgid "Code" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:21 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:23 +msgid "FlyweightInterface.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:29 +msgid "CharacterFlyweight.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:35 +msgid "FlyweightFactory.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:42 +msgid "Test" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:44 +msgid "Tests/FlyweightTest.php" +msgstr "" + diff --git a/locale/es/LC_MESSAGES/Structural/Registry/README.po b/locale/es/LC_MESSAGES/Structural/Registry/README.po index 843138c..ddc6079 100644 --- a/locale/es/LC_MESSAGES/Structural/Registry/README.po +++ b/locale/es/LC_MESSAGES/Structural/Registry/README.po @@ -32,8 +32,8 @@ msgstr "" #: ../../Structural/Registry/README.rst:14 msgid "" -"Zend Framework: ``Zend_Registry`` holds the application's logger object, " -"front controller etc." +"Zend Framework 1: ``Zend_Registry`` holds the application's logger " +"object, front controller etc." msgstr "" #: ../../Structural/Registry/README.rst:16 diff --git a/locale/pt_BR/LC_MESSAGES/Behavioral/Mediator/README.po b/locale/pt_BR/LC_MESSAGES/Behavioral/Mediator/README.po index 9c6694b..6474cd1 100644 --- a/locale/pt_BR/LC_MESSAGES/Behavioral/Mediator/README.po +++ b/locale/pt_BR/LC_MESSAGES/Behavioral/Mediator/README.po @@ -21,8 +21,8 @@ msgstr "" #: ../../Behavioral/Mediator/README.rst:7 msgid "" -"This pattern provides an easy to decouple many components working together. " -"It is a good alternative over Observer IF you have a \"central " +"This pattern provides an easy way to decouple many components working " +"together. It is a good alternative to Observer IF you have a \"central " "intelligence\", like a controller (but not in the sense of the MVC)." msgstr "" diff --git a/locale/pt_BR/LC_MESSAGES/Behavioral/Memento/README.po b/locale/pt_BR/LC_MESSAGES/Behavioral/Memento/README.po index 913069a..9aa14bc 100644 --- a/locale/pt_BR/LC_MESSAGES/Behavioral/Memento/README.po +++ b/locale/pt_BR/LC_MESSAGES/Behavioral/Memento/README.po @@ -1,15 +1,22 @@ -# +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" #: ../../Behavioral/Memento/README.rst:2 msgid "`Memento`__" @@ -21,65 +28,184 @@ msgstr "" #: ../../Behavioral/Memento/README.rst:7 msgid "" -"Provide the ability to restore an object to its previous state (undo via " -"rollback)." +"It provides the ability to restore an object to it's previous state (undo" +" via rollback) or to gain access to state of the object, without " +"revealing it's implementation (i.e., the object is not required to have a" +" functional for return the current state)." msgstr "" -#: ../../Behavioral/Memento/README.rst:10 +#: ../../Behavioral/Memento/README.rst:12 msgid "" -"The memento pattern is implemented with three objects: the originator, a " -"caretaker and a memento. The originator is some object that has an internal " -"state. The caretaker is going to do something to the originator, but wants " -"to be able to undo the change. The caretaker first asks the originator for a" -" memento object. Then it does whatever operation (or sequence of operations)" -" it was going to do. To roll back to the state before the operations, it " -"returns the memento object to the originator. The memento object itself is " -"an opaque object (one which the caretaker cannot, or should not, change). " -"When using this pattern, care should be taken if the originator may change " -"other objects or resources - the memento pattern operates on a single " -"object." +"The memento pattern is implemented with three objects: the Originator, a " +"Caretaker and a Memento." msgstr "" -#: ../../Behavioral/Memento/README.rst:23 +#: ../../Behavioral/Memento/README.rst:15 +msgid "" +"Memento – an object that *contains a concrete unique snapshot of state* " +"of any object or resource: string, number, array, an instance of class " +"and so on. The uniqueness in this case does not imply the prohibition " +"existence of similar states in different snapshots. That means the state " +"can be extracted as the independent clone. Any object stored in the " +"Memento should be *a full copy of the original object rather than a " +"reference* to the original object. The Memento object is a \"opaque " +"object\" (the object that no one can or should change)." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:24 +msgid "" +"Originator – it is an object that contains the *actual state of an " +"external object is strictly specified type*. Originator is able to create" +" a unique copy of this state and return it wrapped in a Memento. The " +"Originator does not know the history of changes. You can set a concrete " +"state to Originator from the outside, which will be considered as actual." +" The Originator must make sure that given state corresponds the allowed " +"type of object. Originator may (but not should) have any methods, but " +"they *they can't make changes to the saved object state*." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:33 +msgid "" +"Caretaker *controls the states history*. He may make changes to an " +"object; take a decision to save the state of an external object in the " +"Originator; ask from the Originator snapshot of the current state; or set" +" the Originator state to equivalence with some snapshot from history." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:39 msgid "Examples" msgstr "" -#: ../../Behavioral/Memento/README.rst:25 +#: ../../Behavioral/Memento/README.rst:41 msgid "The seed of a pseudorandom number generator" msgstr "" -#: ../../Behavioral/Memento/README.rst:26 +#: ../../Behavioral/Memento/README.rst:42 msgid "The state in a finite state machine" msgstr "" -#: ../../Behavioral/Memento/README.rst:29 -msgid "UML Diagram" -msgstr "" - -#: ../../Behavioral/Memento/README.rst:36 -msgid "Code" -msgstr "" - -#: ../../Behavioral/Memento/README.rst:38 -msgid "You can also find these code on `GitHub`_" -msgstr "" - -#: ../../Behavioral/Memento/README.rst:40 -msgid "Memento.php" +#: ../../Behavioral/Memento/README.rst:43 +msgid "" +"Control for intermediate states of `ORM Model " +"`_ before saving" msgstr "" #: ../../Behavioral/Memento/README.rst:46 +msgid "UML Diagram" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:53 +msgid "Code" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:55 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:57 +msgid "Memento.php" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:63 msgid "Originator.php" msgstr "" -#: ../../Behavioral/Memento/README.rst:52 +#: ../../Behavioral/Memento/README.rst:69 msgid "Caretaker.php" msgstr "" -#: ../../Behavioral/Memento/README.rst:59 +#: ../../Behavioral/Memento/README.rst:76 msgid "Test" msgstr "" -#: ../../Behavioral/Memento/README.rst:61 +#: ../../Behavioral/Memento/README.rst:78 msgid "Tests/MementoTest.php" msgstr "" + + + +#. # +#. msgid "" +#. msgstr "" +#. "Project-Id-Version: DesignPatternsPHP 1.0\n" +#. "Report-Msgid-Bugs-To: \n" +#. "POT-Creation-Date: 2015-05-29 12:18+0200\n" +#. "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +#. "Last-Translator: FULL NAME \n" +#. "Language-Team: LANGUAGE \n" +#. "MIME-Version: 1.0\n" +#. "Content-Type: text/plain; charset=UTF-8\n" +#. "Content-Transfer-Encoding: 8bit\n" +#. +#. #: ../../Behavioral/Memento/README.rst:2 +#. msgid "`Memento`__" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:5 +#. msgid "Purpose" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:7 +#. msgid "" +#. "Provide the ability to restore an object to its previous state (undo via " +#. "rollback)." +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:10 +#. msgid "" +#. "The memento pattern is implemented with three objects: the originator, a " +#. "caretaker and a memento. The originator is some object that has an internal " +#. "state. The caretaker is going to do something to the originator, but wants " +#. "to be able to undo the change. The caretaker first asks the originator for a" +#. " memento object. Then it does whatever operation (or sequence of operations)" +#. " it was going to do. To roll back to the state before the operations, it " +#. "returns the memento object to the originator. The memento object itself is " +#. "an opaque object (one which the caretaker cannot, or should not, change). " +#. "When using this pattern, care should be taken if the originator may change " +#. "other objects or resources - the memento pattern operates on a single " +#. "object." +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:23 +#. msgid "Examples" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:25 +#. msgid "The seed of a pseudorandom number generator" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:26 +#. msgid "The state in a finite state machine" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:29 +#. msgid "UML Diagram" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:36 +#. msgid "Code" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:38 +#. msgid "You can also find these code on `GitHub`_" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:40 +#. msgid "Memento.php" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:46 +#. msgid "Originator.php" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:52 +#. msgid "Caretaker.php" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:59 +#. msgid "Test" +#. msgstr "" +#. +#. #: ../../Behavioral/Memento/README.rst:61 +#. msgid "Tests/MementoTest.php" +#. msgstr "" diff --git a/locale/pt_BR/LC_MESSAGES/More/Delegation/README.po b/locale/pt_BR/LC_MESSAGES/More/Delegation/README.po index 21a201b..ac259f0 100644 --- a/locale/pt_BR/LC_MESSAGES/More/Delegation/README.po +++ b/locale/pt_BR/LC_MESSAGES/More/Delegation/README.po @@ -1,15 +1,22 @@ -# +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" #: ../../More/Delegation/README.rst:2 msgid "`Delegation`__" @@ -19,17 +26,29 @@ msgstr "" msgid "Purpose" msgstr "" -#: ../../More/Delegation/README.rst:7 ../../More/Delegation/README.rst:12 -msgid "..." +#: ../../More/Delegation/README.rst:7 +msgid "" +"Demonstrate the Delegator pattern, where an object, instead of performing" +" one of its stated tasks, delegates that task to an associated helper " +"object. In this case TeamLead professes to writeCode and Usage uses this," +" while TeamLead delegates writeCode to JuniorDeveloper's writeBadCode " +"function. This inverts the responsibility so that Usage is unknowingly " +"executing writeBadCode." msgstr "" #: ../../More/Delegation/README.rst:10 msgid "Examples" msgstr "" +#: ../../More/Delegation/README.rst:12 +msgid "" +"Please review JuniorDeveloper.php, TeamLead.php, and then Usage.php to " +"see it all tied together." +msgstr "" + #: ../../More/Delegation/README.rst:15 msgid "UML Diagram" -msgstr "Diagrama UML" +msgstr "" #: ../../More/Delegation/README.rst:22 msgid "Code" @@ -58,3 +77,4 @@ msgstr "" #: ../../More/Delegation/README.rst:47 msgid "Tests/DelegationTest.php" msgstr "" + diff --git a/locale/pt_BR/LC_MESSAGES/More/EAV/README.po b/locale/pt_BR/LC_MESSAGES/More/EAV/README.po new file mode 100644 index 0000000..c101913 --- /dev/null +++ b/locale/pt_BR/LC_MESSAGES/More/EAV/README.po @@ -0,0 +1,78 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: ../../More/EAV/README.rst:2 +msgid "`Entity-Attribute-Value (EAV)`__" +msgstr "" + +#: ../../More/EAV/README.rst:4 +msgid "" +"The Entity–attribute–value (EAV) pattern in order to implement EAV model " +"with PHP." +msgstr "" + +#: ../../More/EAV/README.rst:7 +msgid "Purpose" +msgstr "" + +#: ../../More/EAV/README.rst:9 +msgid "" +"The Entity–attribute–value (EAV) model is a data model to describe " +"entities where the number of attributes (properties, parameters) that can" +" be used to describe them is potentially vast, but the number that will " +"actually apply to a given entity is relatively modest." +msgstr "" + +#: ../../More/EAV/README.rst:15 +msgid "Examples" +msgstr "" + +#: ../../More/EAV/README.rst:17 +msgid "Check full work example in `example.php`_ file." +msgstr "" + +#: ../../More/EAV/README.rst:90 +msgid "UML Diagram" +msgstr "" + +#: ../../More/EAV/README.rst:97 +msgid "Code" +msgstr "" + +#: ../../More/EAV/README.rst:99 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../More/EAV/README.rst:102 +msgid "Test" +msgstr "" + +#: ../../More/EAV/README.rst:104 +msgid "Tests/EntityTest.php" +msgstr "" + +#: ../../More/EAV/README.rst:110 +msgid "Tests/AttributeTest.php" +msgstr "" + +#: ../../More/EAV/README.rst:116 +msgid "Tests/ValueTest.php" +msgstr "" + diff --git a/locale/pt_BR/LC_MESSAGES/README.po b/locale/pt_BR/LC_MESSAGES/README.po index a10ea0b..ab971d8 100644 --- a/locale/pt_BR/LC_MESSAGES/README.po +++ b/locale/pt_BR/LC_MESSAGES/README.po @@ -78,8 +78,8 @@ msgid "(The MIT License)" msgstr "(The MIT License)" #: ../../README.rst:48 -msgid "Copyright (c) 2014 `Dominik Liebler`_ and `contributors`_" -msgstr "Copyright (c) 2014 `Dominik Liebler`_ and `contributors`_" +msgid "Copyright (c) 2011 - 2016 `Dominik Liebler`_ and `contributors`_" +msgstr "Copyright (c) 2011 - 2016 `Dominik Liebler`_ and `contributors`_" #: ../../README.rst:50 msgid "" diff --git a/locale/pt_BR/LC_MESSAGES/Structural/Flyweight/README.po b/locale/pt_BR/LC_MESSAGES/Structural/Flyweight/README.po new file mode 100644 index 0000000..9a8b771 --- /dev/null +++ b/locale/pt_BR/LC_MESSAGES/Structural/Flyweight/README.po @@ -0,0 +1,69 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: ../../Structural/Flyweight/README.rst:2 +msgid "`Flyweight`__" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:5 +msgid "Purpose" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:7 +msgid "" +"To minimise memory usage, a Flyweight shares as much as possible memory " +"with similar objects. It is needed when a large amount of objects is used" +" that don't differ much in state. A common practice is to hold state in " +"external data structures and pass them to the flyweight object when " +"needed." +msgstr "" + +#: ../../Structural/Flyweight/README.rst:12 +msgid "UML Diagram" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:19 +msgid "Code" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:21 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:23 +msgid "FlyweightInterface.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:29 +msgid "CharacterFlyweight.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:35 +msgid "FlyweightFactory.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:42 +msgid "Test" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:44 +msgid "Tests/FlyweightTest.php" +msgstr "" + diff --git a/locale/pt_BR/LC_MESSAGES/Structural/Registry/README.po b/locale/pt_BR/LC_MESSAGES/Structural/Registry/README.po index 843138c..ddc6079 100644 --- a/locale/pt_BR/LC_MESSAGES/Structural/Registry/README.po +++ b/locale/pt_BR/LC_MESSAGES/Structural/Registry/README.po @@ -32,8 +32,8 @@ msgstr "" #: ../../Structural/Registry/README.rst:14 msgid "" -"Zend Framework: ``Zend_Registry`` holds the application's logger object, " -"front controller etc." +"Zend Framework 1: ``Zend_Registry`` holds the application's logger " +"object, front controller etc." msgstr "" #: ../../Structural/Registry/README.rst:16 diff --git a/locale/ru/LC_MESSAGES/Behavioral/Mediator/README.po b/locale/ru/LC_MESSAGES/Behavioral/Mediator/README.po index 13b8089..7d07e12 100644 --- a/locale/ru/LC_MESSAGES/Behavioral/Mediator/README.po +++ b/locale/ru/LC_MESSAGES/Behavioral/Mediator/README.po @@ -23,9 +23,9 @@ msgstr "Назначение" #: ../../Behavioral/Mediator/README.rst:7 msgid "" -"This pattern provides an easy to decouple many components working together. " -"It is a good alternative over Observer IF you have a \"central intelligence" -"\", like a controller (but not in the sense of the MVC)." +"This pattern provides an easy way to decouple many components working " +"together. It is a good alternative to Observer IF you have a \"central " +"intelligence\", like a controller (but not in the sense of the MVC)." msgstr "" "Этот паттерн позволяет снизить связность множества компонентов, работающих " "совместно. Объектам больше нет нужды вызывать друг друга напрямую. Это " diff --git a/locale/ru/LC_MESSAGES/Behavioral/Memento/README.po b/locale/ru/LC_MESSAGES/Behavioral/Memento/README.po index 146f4f5..5107f84 100644 --- a/locale/ru/LC_MESSAGES/Behavioral/Memento/README.po +++ b/locale/ru/LC_MESSAGES/Behavioral/Memento/README.po @@ -1,115 +1,241 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. # +#, fuzzy msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 01:42+0300\n" -"Last-Translator: Eugene Glotov \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" +"Generated-By: Babel 2.3.4\n" #: ../../Behavioral/Memento/README.rst:2 msgid "`Memento`__" -msgstr "`Хранитель`__" +msgstr "" #: ../../Behavioral/Memento/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "" #: ../../Behavioral/Memento/README.rst:7 msgid "" -"Provide the ability to restore an object to its previous state (undo via " -"rollback)." +"It provides the ability to restore an object to it's previous state (undo" +" via rollback) or to gain access to state of the object, without " +"revealing it's implementation (i.e., the object is not required to have a" +" functional for return the current state)." msgstr "" -"Предоставляет возможность восстановить объект в его предыдущем состоянии или " -"получить доступ к состоянию объекта, не раскрывая его реализацию (т.е. сам " -"объект не обязан иметь функционал возврата текущего состояния)." -#: ../../Behavioral/Memento/README.rst:10 +#: ../../Behavioral/Memento/README.rst:12 msgid "" -"The memento pattern is implemented with three objects: the originator, a " -"caretaker and a memento. The originator is some object that has an internal " -"state. The caretaker is going to do something to the originator, but wants " -"to be able to undo the change. The caretaker first asks the originator for a" -" memento object. Then it does whatever operation (or sequence of operations)" -" it was going to do. To roll back to the state before the operations, it " -"returns the memento object to the originator. The memento object itself is " -"an opaque object (one which the caretaker cannot, or should not, change). " -"When using this pattern, care should be taken if the originator may change " -"other objects or resources - the memento pattern operates on a single " -"object." +"The memento pattern is implemented with three objects: the Originator, a " +"Caretaker and a Memento." msgstr "" -"Паттерн «Хранитель» реализуется тремя объектами: Создатель, Опекун и " -"Хранитель.\n" -"\n" -"Хранитель — объект, который *хранит конкретный уникальный слепок состояния* " -"любого объекта или ресурса: строка, число, массив, экземпляр класса и так " -"далее. Уникальность в данном случае подразумевает не запрет существования " -"одинаковых состояний в слепках, а то, что состояние можно извлечь в виде " -"независимого клона. Это значит, объект, сохраняемый в Хранитель, должен *быть " -"полной копией исходного объекта а не ссылкой* на исходный объект. Сам объект " -"Хранитель является «непрозрачным объектом» (тот, который никто не может и не " -"должен изменять).\n" -"\n" -"Создатель — это объект, который *содержит в себе актуальное состояние внешнего " -"объекта строго заданного типа* и умеет создать уникальную копию этого " -"состояния, возвращая её обёрнутую в Хранитель. Создатель не знает истории " -"изменений. Создателю можно принудительно установить конкретное состояние " -"извне, которое будет считаться актуальным. Создатель должен позаботиться, " -"чтобы это состояние соответствовало типу объекта, с которым ему разрешено " -"работать. Создатель может (но не обязан) иметь любые методы, но они *не могут " -"менять сохранённое состояние объекта*.\n" -"\n" -"Опекун *управляет историей слепков состояний*. Он может вносить изменения в " -"объект, принимать решение о сохранении состояния внешнего объекта в Создателе, " -"требовать от Создателя слепок текущего состояния, или привести состояние " -"Создателя в соответствие состоянию какого-то слепка из истории." -#: ../../Behavioral/Memento/README.rst:23 +#: ../../Behavioral/Memento/README.rst:15 +msgid "" +"Memento – an object that *contains a concrete unique snapshot of state* " +"of any object or resource: string, number, array, an instance of class " +"and so on. The uniqueness in this case does not imply the prohibition " +"existence of similar states in different snapshots. That means the state " +"can be extracted as the independent clone. Any object stored in the " +"Memento should be *a full copy of the original object rather than a " +"reference* to the original object. The Memento object is a \"opaque " +"object\" (the object that no one can or should change)." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:24 +msgid "" +"Originator – it is an object that contains the *actual state of an " +"external object is strictly specified type*. Originator is able to create" +" a unique copy of this state and return it wrapped in a Memento. The " +"Originator does not know the history of changes. You can set a concrete " +"state to Originator from the outside, which will be considered as actual." +" The Originator must make sure that given state corresponds the allowed " +"type of object. Originator may (but not should) have any methods, but " +"they *they can't make changes to the saved object state*." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:33 +msgid "" +"Caretaker *controls the states history*. He may make changes to an " +"object; take a decision to save the state of an external object in the " +"Originator; ask from the Originator snapshot of the current state; or set" +" the Originator state to equivalence with some snapshot from history." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:39 msgid "Examples" -msgstr "Примеры" +msgstr "" -#: ../../Behavioral/Memento/README.rst:25 +#: ../../Behavioral/Memento/README.rst:41 msgid "The seed of a pseudorandom number generator" msgstr "" -"`Семя `_ псевдослучайного генератора " -"чисел." -#: ../../Behavioral/Memento/README.rst:26 +#: ../../Behavioral/Memento/README.rst:42 msgid "The state in a finite state machine" -msgstr "Состояние конечного автомата" +msgstr "" -#: ../../Behavioral/Memento/README.rst:29 -msgid "UML Diagram" -msgstr "UML Диаграмма" - -#: ../../Behavioral/Memento/README.rst:36 -msgid "Code" -msgstr "Код" - -#: ../../Behavioral/Memento/README.rst:38 -msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" - -#: ../../Behavioral/Memento/README.rst:40 -msgid "Memento.php" -msgstr "Memento.php" +#: ../../Behavioral/Memento/README.rst:43 +msgid "" +"Control for intermediate states of `ORM Model " +"`_ before saving" +msgstr "" #: ../../Behavioral/Memento/README.rst:46 +msgid "UML Diagram" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:53 +msgid "Code" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:55 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:57 +msgid "Memento.php" +msgstr "" + +#: ../../Behavioral/Memento/README.rst:63 msgid "Originator.php" -msgstr "Originator.php" +msgstr "" -#: ../../Behavioral/Memento/README.rst:52 +#: ../../Behavioral/Memento/README.rst:69 msgid "Caretaker.php" -msgstr "Caretaker.php" +msgstr "" -#: ../../Behavioral/Memento/README.rst:59 +#: ../../Behavioral/Memento/README.rst:76 msgid "Test" -msgstr "Тест" +msgstr "" -#: ../../Behavioral/Memento/README.rst:61 +#: ../../Behavioral/Memento/README.rst:78 msgid "Tests/MementoTest.php" -msgstr "Tests/MementoTest.php" +msgstr "" + + + +#. # +#. msgid "" +#. msgstr "" +#. "Project-Id-Version: DesignPatternsPHP 1.0\n" +#. "Report-Msgid-Bugs-To: \n" +#. "POT-Creation-Date: 2015-05-29 12:18+0200\n" +#. "PO-Revision-Date: 2015-05-30 01:42+0300\n" +#. "Last-Translator: Eugene Glotov \n" +#. "MIME-Version: 1.0\n" +#. "Content-Type: text/plain; charset=UTF-8\n" +#. "Content-Transfer-Encoding: 8bit\n" +#. "Language: ru\n" +#. +#. #: ../../Behavioral/Memento/README.rst:2 +#. msgid "`Memento`__" +#. msgstr "`Хранитель`__" +#. +#. #: ../../Behavioral/Memento/README.rst:5 +#. msgid "Purpose" +#. msgstr "Назначение" +#. +#. #: ../../Behavioral/Memento/README.rst:7 +#. msgid "" +#. "Provide the ability to restore an object to its previous state (undo via " +#. "rollback)." +#. msgstr "" +#. "Предоставляет возможность восстановить объект в его предыдущем состоянии или " +#. "получить доступ к состоянию объекта, не раскрывая его реализацию (т.е. сам " +#. "объект не обязан иметь функционал возврата текущего состояния)." +#. +#. #: ../../Behavioral/Memento/README.rst:10 +#. msgid "" +#. "The memento pattern is implemented with three objects: the originator, a " +#. "caretaker and a memento. The originator is some object that has an internal " +#. "state. The caretaker is going to do something to the originator, but wants " +#. "to be able to undo the change. The caretaker first asks the originator for a" +#. " memento object. Then it does whatever operation (or sequence of operations)" +#. " it was going to do. To roll back to the state before the operations, it " +#. "returns the memento object to the originator. The memento object itself is " +#. "an opaque object (one which the caretaker cannot, or should not, change). " +#. "When using this pattern, care should be taken if the originator may change " +#. "other objects or resources - the memento pattern operates on a single " +#. "object." +#. msgstr "" +#. "Паттерн «Хранитель» реализуется тремя объектами: Создатель, Опекун и " +#. "Хранитель.\n" +#. "\n" +#. "Хранитель — объект, который *хранит конкретный уникальный слепок состояния* " +#. "любого объекта или ресурса: строка, число, массив, экземпляр класса и так " +#. "далее. Уникальность в данном случае подразумевает не запрет существования " +#. "одинаковых состояний в слепках, а то, что состояние можно извлечь в виде " +#. "независимого клона. Это значит, объект, сохраняемый в Хранитель, должен *быть " +#. "полной копией исходного объекта а не ссылкой* на исходный объект. Сам объект " +#. "Хранитель является «непрозрачным объектом» (тот, который никто не может и не " +#. "должен изменять).\n" +#. "\n" +#. "Создатель — это объект, который *содержит в себе актуальное состояние внешнего " +#. "объекта строго заданного типа* и умеет создать уникальную копию этого " +#. "состояния, возвращая её обёрнутую в Хранитель. Создатель не знает истории " +#. "изменений. Создателю можно принудительно установить конкретное состояние " +#. "извне, которое будет считаться актуальным. Создатель должен позаботиться, " +#. "чтобы это состояние соответствовало типу объекта, с которым ему разрешено " +#. "работать. Создатель может (но не обязан) иметь любые методы, но они *не могут " +#. "менять сохранённое состояние объекта*.\n" +#. "\n" +#. "Опекун *управляет историей слепков состояний*. Он может вносить изменения в " +#. "объект, принимать решение о сохранении состояния внешнего объекта в Создателе, " +#. "требовать от Создателя слепок текущего состояния, или привести состояние " +#. "Создателя в соответствие состоянию какого-то слепка из истории." +#. +#. #: ../../Behavioral/Memento/README.rst:23 +#. msgid "Examples" +#. msgstr "Примеры" +#. +#. #: ../../Behavioral/Memento/README.rst:25 +#. msgid "The seed of a pseudorandom number generator" +#. msgstr "" +#. "`Семя `_ псевдослучайного генератора " +#. "чисел." +#. +#. #: ../../Behavioral/Memento/README.rst:26 +#. msgid "The state in a finite state machine" +#. msgstr "Состояние конечного автомата" +#. +#. #: ../../Behavioral/Memento/README.rst:29 +#. msgid "UML Diagram" +#. msgstr "UML Диаграмма" +#. +#. #: ../../Behavioral/Memento/README.rst:36 +#. msgid "Code" +#. msgstr "Код" +#. +#. #: ../../Behavioral/Memento/README.rst:38 +#. msgid "You can also find these code on `GitHub`_" +#. msgstr "Вы можете найти этот код на `GitHub`_" +#. +#. #: ../../Behavioral/Memento/README.rst:40 +#. msgid "Memento.php" +#. msgstr "Memento.php" +#. +#. #: ../../Behavioral/Memento/README.rst:46 +#. msgid "Originator.php" +#. msgstr "Originator.php" +#. +#. #: ../../Behavioral/Memento/README.rst:52 +#. msgid "Caretaker.php" +#. msgstr "Caretaker.php" +#. +#. #: ../../Behavioral/Memento/README.rst:59 +#. msgid "Test" +#. msgstr "Тест" +#. +#. #: ../../Behavioral/Memento/README.rst:61 +#. msgid "Tests/MementoTest.php" +#. msgstr "Tests/MementoTest.php" diff --git a/locale/ru/LC_MESSAGES/More/Delegation/README.po b/locale/ru/LC_MESSAGES/More/Delegation/README.po index 958fd7a..3e2676f 100644 --- a/locale/ru/LC_MESSAGES/More/Delegation/README.po +++ b/locale/ru/LC_MESSAGES/More/Delegation/README.po @@ -1,60 +1,142 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. # +#, fuzzy msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-29 12:18+0200\n" -"PO-Revision-Date: 2015-05-30 04:46+0300\n" -"Last-Translator: Eugene Glotov \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" +"Generated-By: Babel 2.3.4\n" #: ../../More/Delegation/README.rst:2 msgid "`Delegation`__" -msgstr "`Делегирование `_ (`Delegation`__)" +msgstr "" #: ../../More/Delegation/README.rst:5 msgid "Purpose" -msgstr "Назначение" +msgstr "" -#: ../../More/Delegation/README.rst:7 ../../More/Delegation/README.rst:12 -msgid "..." -msgstr "Основной шаблон проектирования, в котором объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту. Шаблон делегирования является фундаментальной абстракцией, на основе которой реализованы другие шаблоны - композиция (также называемая агрегацией), примеси (mixins) и аспекты (aspects). (c) wiki" +#: ../../More/Delegation/README.rst:7 +msgid "" +"Demonstrate the Delegator pattern, where an object, instead of performing" +" one of its stated tasks, delegates that task to an associated helper " +"object. In this case TeamLead professes to writeCode and Usage uses this," +" while TeamLead delegates writeCode to JuniorDeveloper's writeBadCode " +"function. This inverts the responsibility so that Usage is unknowingly " +"executing writeBadCode." +msgstr "" #: ../../More/Delegation/README.rst:10 msgid "Examples" -msgstr "Примеры" +msgstr "" + +#: ../../More/Delegation/README.rst:12 +msgid "" +"Please review JuniorDeveloper.php, TeamLead.php, and then Usage.php to " +"see it all tied together." +msgstr "" #: ../../More/Delegation/README.rst:15 msgid "UML Diagram" -msgstr "UML Диаграмма" +msgstr "" #: ../../More/Delegation/README.rst:22 msgid "Code" -msgstr "Код" +msgstr "" #: ../../More/Delegation/README.rst:24 msgid "You can also find these code on `GitHub`_" -msgstr "Вы можете найти этот код на `GitHub`_" +msgstr "" #: ../../More/Delegation/README.rst:26 msgid "Usage.php" -msgstr "Usage.php" +msgstr "" #: ../../More/Delegation/README.rst:32 msgid "TeamLead.php" -msgstr "TeamLead.php" +msgstr "" #: ../../More/Delegation/README.rst:38 msgid "JuniorDeveloper.php" -msgstr "JuniorDeveloper.php" +msgstr "" #: ../../More/Delegation/README.rst:45 msgid "Test" -msgstr "Тест" +msgstr "" #: ../../More/Delegation/README.rst:47 msgid "Tests/DelegationTest.php" -msgstr "Tests/DelegationTest.php" +msgstr "" + + + +#. # +#. msgid "" +#. msgstr "" +#. "Project-Id-Version: DesignPatternsPHP 1.0\n" +#. "Report-Msgid-Bugs-To: \n" +#. "POT-Creation-Date: 2015-05-29 12:18+0200\n" +#. "PO-Revision-Date: 2015-05-30 04:46+0300\n" +#. "Last-Translator: Eugene Glotov \n" +#. "MIME-Version: 1.0\n" +#. "Content-Type: text/plain; charset=UTF-8\n" +#. "Content-Transfer-Encoding: 8bit\n" +#. "Language: ru\n" +#. +#. #: ../../More/Delegation/README.rst:2 +#. msgid "`Delegation`__" +#. msgstr "`Делегирование `_ (`Delegation`__)" +#. +#. #: ../../More/Delegation/README.rst:5 +#. msgid "Purpose" +#. msgstr "Назначение" +#. +#. #: ../../More/Delegation/README.rst:7 ../../More/Delegation/README.rst:12 +#. msgid "..." +#. msgstr "Основной шаблон проектирования, в котором объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту. Шаблон делегирования является фундаментальной абстракцией, на основе которой реализованы другие шаблоны - композиция (также называемая агрегацией), примеси (mixins) и аспекты (aspects). (c) wiki" +#. +#. #: ../../More/Delegation/README.rst:10 +#. msgid "Examples" +#. msgstr "Примеры" +#. +#. #: ../../More/Delegation/README.rst:15 +#. msgid "UML Diagram" +#. msgstr "UML Диаграмма" +#. +#. #: ../../More/Delegation/README.rst:22 +#. msgid "Code" +#. msgstr "Код" +#. +#. #: ../../More/Delegation/README.rst:24 +#. msgid "You can also find these code on `GitHub`_" +#. msgstr "Вы можете найти этот код на `GitHub`_" +#. +#. #: ../../More/Delegation/README.rst:26 +#. msgid "Usage.php" +#. msgstr "Usage.php" +#. +#. #: ../../More/Delegation/README.rst:32 +#. msgid "TeamLead.php" +#. msgstr "TeamLead.php" +#. +#. #: ../../More/Delegation/README.rst:38 +#. msgid "JuniorDeveloper.php" +#. msgstr "JuniorDeveloper.php" +#. +#. #: ../../More/Delegation/README.rst:45 +#. msgid "Test" +#. msgstr "Тест" +#. +#. #: ../../More/Delegation/README.rst:47 +#. msgid "Tests/DelegationTest.php" +#. msgstr "Tests/DelegationTest.php" diff --git a/locale/ru/LC_MESSAGES/More/EAV/README.po b/locale/ru/LC_MESSAGES/More/EAV/README.po new file mode 100644 index 0000000..c101913 --- /dev/null +++ b/locale/ru/LC_MESSAGES/More/EAV/README.po @@ -0,0 +1,78 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: ../../More/EAV/README.rst:2 +msgid "`Entity-Attribute-Value (EAV)`__" +msgstr "" + +#: ../../More/EAV/README.rst:4 +msgid "" +"The Entity–attribute–value (EAV) pattern in order to implement EAV model " +"with PHP." +msgstr "" + +#: ../../More/EAV/README.rst:7 +msgid "Purpose" +msgstr "" + +#: ../../More/EAV/README.rst:9 +msgid "" +"The Entity–attribute–value (EAV) model is a data model to describe " +"entities where the number of attributes (properties, parameters) that can" +" be used to describe them is potentially vast, but the number that will " +"actually apply to a given entity is relatively modest." +msgstr "" + +#: ../../More/EAV/README.rst:15 +msgid "Examples" +msgstr "" + +#: ../../More/EAV/README.rst:17 +msgid "Check full work example in `example.php`_ file." +msgstr "" + +#: ../../More/EAV/README.rst:90 +msgid "UML Diagram" +msgstr "" + +#: ../../More/EAV/README.rst:97 +msgid "Code" +msgstr "" + +#: ../../More/EAV/README.rst:99 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../More/EAV/README.rst:102 +msgid "Test" +msgstr "" + +#: ../../More/EAV/README.rst:104 +msgid "Tests/EntityTest.php" +msgstr "" + +#: ../../More/EAV/README.rst:110 +msgid "Tests/AttributeTest.php" +msgstr "" + +#: ../../More/EAV/README.rst:116 +msgid "Tests/ValueTest.php" +msgstr "" + diff --git a/locale/ru/LC_MESSAGES/README.po b/locale/ru/LC_MESSAGES/README.po index 5efb48e..5ef6690 100644 --- a/locale/ru/LC_MESSAGES/README.po +++ b/locale/ru/LC_MESSAGES/README.po @@ -76,8 +76,8 @@ msgid "(The MIT License)" msgstr "(The MIT License)" #: ../../README.rst:48 -msgid "Copyright (c) 2014 `Dominik Liebler`_ and `contributors`_" -msgstr "Copyright (c) 2014 `Dominik Liebler`_ and `contributors`_" +msgid "Copyright (c) 2011 - 2016 `Dominik Liebler`_ and `contributors`_" +msgstr "Copyright (c) 2011 - 2016 `Dominik Liebler`_ and `contributors`_" #: ../../README.rst:50 msgid "" diff --git a/locale/ru/LC_MESSAGES/Structural/Flyweight/README.po b/locale/ru/LC_MESSAGES/Structural/Flyweight/README.po new file mode 100644 index 0000000..9a8b771 --- /dev/null +++ b/locale/ru/LC_MESSAGES/Structural/Flyweight/README.po @@ -0,0 +1,69 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: ../../Structural/Flyweight/README.rst:2 +msgid "`Flyweight`__" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:5 +msgid "Purpose" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:7 +msgid "" +"To minimise memory usage, a Flyweight shares as much as possible memory " +"with similar objects. It is needed when a large amount of objects is used" +" that don't differ much in state. A common practice is to hold state in " +"external data structures and pass them to the flyweight object when " +"needed." +msgstr "" + +#: ../../Structural/Flyweight/README.rst:12 +msgid "UML Diagram" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:19 +msgid "Code" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:21 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:23 +msgid "FlyweightInterface.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:29 +msgid "CharacterFlyweight.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:35 +msgid "FlyweightFactory.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:42 +msgid "Test" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:44 +msgid "Tests/FlyweightTest.php" +msgstr "" + diff --git a/locale/ru/LC_MESSAGES/Structural/Registry/README.po b/locale/ru/LC_MESSAGES/Structural/Registry/README.po index b7b7fe4..9c151a2 100644 --- a/locale/ru/LC_MESSAGES/Structural/Registry/README.po +++ b/locale/ru/LC_MESSAGES/Structural/Registry/README.po @@ -35,10 +35,10 @@ msgstr "Примеры" #: ../../Structural/Registry/README.rst:14 msgid "" -"Zend Framework: ``Zend_Registry`` holds the application's logger object, " -"front controller etc." +"Zend Framework 1: ``Zend_Registry`` holds the application's logger " +"object, front controller etc." msgstr "" -"Zend Framework: ``Zend_Registry`` содержит объект журналирования " +"Zend Framework 1: ``Zend_Registry`` содержит объект журналирования " "приложения (логгер), фронт-контроллер и т.д." #: ../../Structural/Registry/README.rst:16 diff --git a/locale/zh_CN/LC_MESSAGES/Behavioral/Mediator/README.po b/locale/zh_CN/LC_MESSAGES/Behavioral/Mediator/README.po index 9c6694b..6474cd1 100644 --- a/locale/zh_CN/LC_MESSAGES/Behavioral/Mediator/README.po +++ b/locale/zh_CN/LC_MESSAGES/Behavioral/Mediator/README.po @@ -21,8 +21,8 @@ msgstr "" #: ../../Behavioral/Mediator/README.rst:7 msgid "" -"This pattern provides an easy to decouple many components working together. " -"It is a good alternative over Observer IF you have a \"central " +"This pattern provides an easy way to decouple many components working " +"together. It is a good alternative to Observer IF you have a \"central " "intelligence\", like a controller (but not in the sense of the MVC)." msgstr "" diff --git a/locale/zh_CN/LC_MESSAGES/Behavioral/Memento/README.po b/locale/zh_CN/LC_MESSAGES/Behavioral/Memento/README.po index fa2378c..e92a849 100644 --- a/locale/zh_CN/LC_MESSAGES/Behavioral/Memento/README.po +++ b/locale/zh_CN/LC_MESSAGES/Behavioral/Memento/README.po @@ -1,15 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. # +#, fuzzy msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" #: ../../Behavioral/Memento/README.rst:2 msgid "`Memento`__" @@ -19,6 +26,52 @@ msgstr "" msgid "Purpose" msgstr "" +#: ../../Behavioral/Memento/README.rst:7 +msgid "" +"It provides the ability to restore an object to it's previous state (undo" +" via rollback) or to gain access to state of the object, without " +"revealing it's implementation (i.e., the object is not required to have a" +" functional for return the current state)." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:12 +msgid "" +"The memento pattern is implemented with three objects: the Originator, a " +"Caretaker and a Memento." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:15 +msgid "" +"Memento – an object that *contains a concrete unique snapshot of state* " +"of any object or resource: string, number, array, an instance of class " +"and so on. The uniqueness in this case does not imply the prohibition " +"existence of similar states in different snapshots. That means the state " +"can be extracted as the independent clone. Any object stored in the " +"Memento should be *a full copy of the original object rather than a " +"reference* to the original object. The Memento object is a \"opaque " +"object\" (the object that no one can or should change)." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:24 +msgid "" +"Originator – it is an object that contains the *actual state of an " +"external object is strictly specified type*. Originator is able to create" +" a unique copy of this state and return it wrapped in a Memento. The " +"Originator does not know the history of changes. You can set a concrete " +"state to Originator from the outside, which will be considered as actual." +" The Originator must make sure that given state corresponds the allowed " +"type of object. Originator may (but not should) have any methods, but " +"they *they can't make changes to the saved object state*." +msgstr "" + +#: ../../Behavioral/Memento/README.rst:33 +msgid "" +"Caretaker *controls the states history*. He may make changes to an " +"object; take a decision to save the state of an external object in the " +"Originator; ask from the Originator snapshot of the current state; or set" +" the Originator state to equivalence with some snapshot from history." +msgstr "" + #: ../../Behavioral/Memento/README.rst:39 msgid "Examples" msgstr "" @@ -31,6 +84,12 @@ msgstr "" msgid "The state in a finite state machine" msgstr "" +#: ../../Behavioral/Memento/README.rst:43 +msgid "" +"Control for intermediate states of `ORM Model " +"`_ before saving" +msgstr "" + #: ../../Behavioral/Memento/README.rst:46 msgid "UML Diagram" msgstr "" @@ -63,73 +122,3 @@ msgstr "" msgid "Tests/MementoTest.php" msgstr "" -#: ../../Behavioral/Memento/README.rst:7 -msgid "" -"It provides the ability to restore an object to it's previous state (undo " -"via rollback) or to gain access to state of the object, without revealing " -"it's implementation (i.e., the object is not required to have a functional " -"for return the current state)." -msgstr "" - -#: ../../Behavioral/Memento/README.rst:12 -msgid "" -"The memento pattern is implemented with three objects: the Originator, a " -"Caretaker and a Memento." -msgstr "" - -#: ../../Behavioral/Memento/README.rst:15 -msgid "" -"Memento – an object that *contains a concrete unique snapshot of state* of " -"any object or resource: string, number, array, an instance of class and so " -"on. The uniqueness in this case does not imply the prohibition existence of " -"similar states in different snapshots. That means the state can be extracted" -" as the independent clone. Any object stored in the Memento should be *a " -"full copy of the original object rather than a reference* to the original " -"object. The Memento object is a \"opaque object\" (the object that no one " -"can or should change)." -msgstr "" - -#: ../../Behavioral/Memento/README.rst:24 -msgid "" -"Originator – it is an object that contains the *actual state of an external " -"object is strictly specified type*. Originator is able to create a unique " -"copy of this state and return it wrapped in a Memento. The Originator does " -"not know the history of changes. You can set a concrete state to Originator " -"from the outside, which will be considered as actual. The Originator must " -"make sure that given state corresponds the allowed type of object. " -"Originator may (but not should) have any methods, but they *they can't make " -"changes to the saved object state*." -msgstr "" - -#: ../../Behavioral/Memento/README.rst:33 -msgid "" -"Caretaker *controls the states history*. He may make changes to an object; " -"take a decision to save the state of an external object in the Originator; " -"ask from the Originator snapshot of the current state; or set the Originator" -" state to equivalence with some snapshot from history." -msgstr "" - -#: ../../Behavioral/Memento/README.rst:43 -msgid "" -"Control for intermediate states of `ORM Model `_ before saving" -msgstr "" - -#~ msgid "" -#~ "Provide the ability to restore an object to its previous state (undo via " -#~ "rollback)." -#~ msgstr "" - -#~ msgid "" -#~ "The memento pattern is implemented with three objects: the originator, a " -#~ "caretaker and a memento. The originator is some object that has an internal " -#~ "state. The caretaker is going to do something to the originator, but wants " -#~ "to be able to undo the change. The caretaker first asks the originator for a" -#~ " memento object. Then it does whatever operation (or sequence of operations)" -#~ " it was going to do. To roll back to the state before the operations, it " -#~ "returns the memento object to the originator. The memento object itself is " -#~ "an opaque object (one which the caretaker cannot, or should not, change). " -#~ "When using this pattern, care should be taken if the originator may change " -#~ "other objects or resources - the memento pattern operates on a single " -#~ "object." -#~ msgstr "" diff --git a/locale/zh_CN/LC_MESSAGES/More/Delegation/README.po b/locale/zh_CN/LC_MESSAGES/More/Delegation/README.po index 0b52512..ac259f0 100644 --- a/locale/zh_CN/LC_MESSAGES/More/Delegation/README.po +++ b/locale/zh_CN/LC_MESSAGES/More/Delegation/README.po @@ -1,15 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. # +#, fuzzy msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-29 12:18+0200\n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" #: ../../More/Delegation/README.rst:2 msgid "`Delegation`__" @@ -19,10 +26,26 @@ msgstr "" msgid "Purpose" msgstr "" +#: ../../More/Delegation/README.rst:7 +msgid "" +"Demonstrate the Delegator pattern, where an object, instead of performing" +" one of its stated tasks, delegates that task to an associated helper " +"object. In this case TeamLead professes to writeCode and Usage uses this," +" while TeamLead delegates writeCode to JuniorDeveloper's writeBadCode " +"function. This inverts the responsibility so that Usage is unknowingly " +"executing writeBadCode." +msgstr "" + #: ../../More/Delegation/README.rst:10 msgid "Examples" msgstr "" +#: ../../More/Delegation/README.rst:12 +msgid "" +"Please review JuniorDeveloper.php, TeamLead.php, and then Usage.php to " +"see it all tied together." +msgstr "" + #: ../../More/Delegation/README.rst:15 msgid "UML Diagram" msgstr "" @@ -55,21 +78,3 @@ msgstr "" msgid "Tests/DelegationTest.php" msgstr "" -#: ../../More/Delegation/README.rst:7 -msgid "" -"Demonstrate the Delegator pattern, where an object, instead of performing " -"one of its stated tasks, delegates that task to an associated helper object." -" In this case TeamLead professes to writeCode and Usage uses this, while " -"TeamLead delegates writeCode to JuniorDeveloper's writeBadCode function. " -"This inverts the responsibility so that Usage is unknowingly executing " -"writeBadCode." -msgstr "" - -#: ../../More/Delegation/README.rst:12 -msgid "" -"Please review JuniorDeveloper.php, TeamLead.php, and then Usage.php to see " -"it all tied together." -msgstr "" - -#~ msgid "..." -#~ msgstr "" diff --git a/locale/zh_CN/LC_MESSAGES/More/EAV/README.po b/locale/zh_CN/LC_MESSAGES/More/EAV/README.po new file mode 100644 index 0000000..c101913 --- /dev/null +++ b/locale/zh_CN/LC_MESSAGES/More/EAV/README.po @@ -0,0 +1,78 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: ../../More/EAV/README.rst:2 +msgid "`Entity-Attribute-Value (EAV)`__" +msgstr "" + +#: ../../More/EAV/README.rst:4 +msgid "" +"The Entity–attribute–value (EAV) pattern in order to implement EAV model " +"with PHP." +msgstr "" + +#: ../../More/EAV/README.rst:7 +msgid "Purpose" +msgstr "" + +#: ../../More/EAV/README.rst:9 +msgid "" +"The Entity–attribute–value (EAV) model is a data model to describe " +"entities where the number of attributes (properties, parameters) that can" +" be used to describe them is potentially vast, but the number that will " +"actually apply to a given entity is relatively modest." +msgstr "" + +#: ../../More/EAV/README.rst:15 +msgid "Examples" +msgstr "" + +#: ../../More/EAV/README.rst:17 +msgid "Check full work example in `example.php`_ file." +msgstr "" + +#: ../../More/EAV/README.rst:90 +msgid "UML Diagram" +msgstr "" + +#: ../../More/EAV/README.rst:97 +msgid "Code" +msgstr "" + +#: ../../More/EAV/README.rst:99 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../More/EAV/README.rst:102 +msgid "Test" +msgstr "" + +#: ../../More/EAV/README.rst:104 +msgid "Tests/EntityTest.php" +msgstr "" + +#: ../../More/EAV/README.rst:110 +msgid "Tests/AttributeTest.php" +msgstr "" + +#: ../../More/EAV/README.rst:116 +msgid "Tests/ValueTest.php" +msgstr "" + diff --git a/locale/zh_CN/LC_MESSAGES/README.po b/locale/zh_CN/LC_MESSAGES/README.po index b2d9e60..f3bae2c 100644 --- a/locale/zh_CN/LC_MESSAGES/README.po +++ b/locale/zh_CN/LC_MESSAGES/README.po @@ -71,8 +71,8 @@ msgid "(The MIT License)" msgstr "MIT 授权协议" #: ../../README.rst:48 -msgid "Copyright (c) 2014 `Dominik Liebler`_ and `contributors`_" -msgstr "Copyright (c) 2014 `Dominik Liebler`_ 和 `贡献者`_" +msgid "Copyright (c) 2011 - 2016 `Dominik Liebler`_ and `contributors`_" +msgstr "Copyright (c) 2011 - 2016 `Dominik Liebler`_ 和 `贡献者`_" #: ../../README.rst:50 msgid "" diff --git a/locale/zh_CN/LC_MESSAGES/Structural/Flyweight/README.po b/locale/zh_CN/LC_MESSAGES/Structural/Flyweight/README.po new file mode 100644 index 0000000..9a8b771 --- /dev/null +++ b/locale/zh_CN/LC_MESSAGES/Structural/Flyweight/README.po @@ -0,0 +1,69 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2015, Dominik Liebler and contributors +# This file is distributed under the same license as the DesignPatternsPHP +# package. +# FIRST AUTHOR , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: DesignPatternsPHP 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-03 23:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.3.4\n" + +#: ../../Structural/Flyweight/README.rst:2 +msgid "`Flyweight`__" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:5 +msgid "Purpose" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:7 +msgid "" +"To minimise memory usage, a Flyweight shares as much as possible memory " +"with similar objects. It is needed when a large amount of objects is used" +" that don't differ much in state. A common practice is to hold state in " +"external data structures and pass them to the flyweight object when " +"needed." +msgstr "" + +#: ../../Structural/Flyweight/README.rst:12 +msgid "UML Diagram" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:19 +msgid "Code" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:21 +msgid "You can also find these code on `GitHub`_" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:23 +msgid "FlyweightInterface.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:29 +msgid "CharacterFlyweight.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:35 +msgid "FlyweightFactory.php" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:42 +msgid "Test" +msgstr "" + +#: ../../Structural/Flyweight/README.rst:44 +msgid "Tests/FlyweightTest.php" +msgstr "" + diff --git a/locale/zh_CN/LC_MESSAGES/Structural/Registry/README.po b/locale/zh_CN/LC_MESSAGES/Structural/Registry/README.po index f01d956..d56535f 100644 --- a/locale/zh_CN/LC_MESSAGES/Structural/Registry/README.po +++ b/locale/zh_CN/LC_MESSAGES/Structural/Registry/README.po @@ -66,8 +66,8 @@ msgstr "" #: ../../Structural/Registry/README.rst:14 msgid "" -"Zend Framework 1: ``Zend_Registry`` holds the application's logger object, " -"front controller etc." +"Zend Framework 1: ``Zend_Registry`` holds the application's logger " +"object, front controller etc." msgstr "" "Zend Framework 1: ``Zend_Registry`` 持有应用的logger对象,前端控制器等。" From c8e0c74f4683cd2a7e1bbd0a11524c880c9488a0 Mon Sep 17 00:00:00 2001 From: Christophe Vidal Date: Tue, 14 Jun 2016 08:33:07 +0700 Subject: [PATCH 024/148] Fixed style --- Behavioral/Iterator/BookList.php | 2 -- Behavioral/TemplateMethod/Journey.php | 3 --- Creational/Builder/BuilderInterface.php | 3 --- Structural/Facade/Tests/FacadeTest.php | 2 +- Structural/Flyweight/CharacterFlyweight.php | 3 ++- Structural/Flyweight/FlyweightFactory.php | 11 +++++------ Structural/Flyweight/FlyweightInterface.php | 2 +- Structural/Flyweight/Tests/FlyweightTest.php | 6 +++--- 8 files changed, 12 insertions(+), 20 deletions(-) diff --git a/Behavioral/Iterator/BookList.php b/Behavioral/Iterator/BookList.php index 6cc5e5e..784c594 100644 --- a/Behavioral/Iterator/BookList.php +++ b/Behavioral/Iterator/BookList.php @@ -11,8 +11,6 @@ class BookList implements \Countable if (isset($this->books[$bookNumberToGet])) { return $this->books[$bookNumberToGet]; } - - return; } public function addBook(Book $book) diff --git a/Behavioral/TemplateMethod/Journey.php b/Behavioral/TemplateMethod/Journey.php index 6309e7f..c7a6809 100644 --- a/Behavioral/TemplateMethod/Journey.php +++ b/Behavioral/TemplateMethod/Journey.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\TemplateMethod; -/** - * - */ abstract class Journey { /** diff --git a/Creational/Builder/BuilderInterface.php b/Creational/Builder/BuilderInterface.php index f682656..563162f 100644 --- a/Creational/Builder/BuilderInterface.php +++ b/Creational/Builder/BuilderInterface.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\Builder; -/** - * - */ interface BuilderInterface { /** diff --git a/Structural/Facade/Tests/FacadeTest.php b/Structural/Facade/Tests/FacadeTest.php index 0f1ea10..0247aaf 100644 --- a/Structural/Facade/Tests/FacadeTest.php +++ b/Structural/Facade/Tests/FacadeTest.php @@ -34,7 +34,7 @@ class FacadeTest extends \PHPUnit_Framework_TestCase } /** - * @param Computer $facade + * @param Computer $facade * @param OsInterface $os * @dataProvider getComputer */ diff --git a/Structural/Flyweight/CharacterFlyweight.php b/Structural/Flyweight/CharacterFlyweight.php index d0c6399..02657c1 100644 --- a/Structural/Flyweight/CharacterFlyweight.php +++ b/Structural/Flyweight/CharacterFlyweight.php @@ -11,6 +11,7 @@ class CharacterFlyweight implements FlyweightInterface /** * Any state stored by the concrete flyweight must be independent of its context. * For flyweights representing characters, this is usually the corresponding character code. + * * @var string */ private $name; @@ -25,7 +26,7 @@ class CharacterFlyweight implements FlyweightInterface /** * Clients supply the context-dependent information that the flyweight needs to draw itself - * For flyweights representing characters, extrinsic state usually contains e.g. the font + * For flyweights representing characters, extrinsic state usually contains e.g. the font. * * @param string $font */ diff --git a/Structural/Flyweight/FlyweightFactory.php b/Structural/Flyweight/FlyweightFactory.php index c709363..10a0d4d 100644 --- a/Structural/Flyweight/FlyweightFactory.php +++ b/Structural/Flyweight/FlyweightFactory.php @@ -2,8 +2,6 @@ namespace DesignPatterns\Structural\Flyweight; -use DesignPatterns\Structural\Flyweight\CharacterFlyweight; - /** * A factory manages shared flyweights. Clients shouldn't instaniate them directly, * but let the factory take care of returning existing objects or creating new ones. @@ -11,16 +9,17 @@ use DesignPatterns\Structural\Flyweight\CharacterFlyweight; class FlyweightFactory { /** - * Associative store for flyweight objects + * Associative store for flyweight objects. * - * @var Array + * @var array */ private $pool = array(); /** - * Magic getter + * Magic getter. * * @param string $name + * * @return Flyweight */ public function __get($name) @@ -28,7 +27,7 @@ class FlyweightFactory if (!array_key_exists($name, $this->pool)) { $this->pool[$name] = new CharacterFlyweight($name); } - + return $this->pool[$name]; } diff --git a/Structural/Flyweight/FlyweightInterface.php b/Structural/Flyweight/FlyweightInterface.php index 023419c..b12290d 100644 --- a/Structural/Flyweight/FlyweightInterface.php +++ b/Structural/Flyweight/FlyweightInterface.php @@ -3,7 +3,7 @@ namespace DesignPatterns\Structural\Flyweight; /** - * An interface through which flyweights can receive and act on extrinsic state + * An interface through which flyweights can receive and act on extrinsic state. */ interface FlyweightInterface { diff --git a/Structural/Flyweight/Tests/FlyweightTest.php b/Structural/Flyweight/Tests/FlyweightTest.php index 90c3f3a..997c3df 100644 --- a/Structural/Flyweight/Tests/FlyweightTest.php +++ b/Structural/Flyweight/Tests/FlyweightTest.php @@ -6,12 +6,12 @@ use DesignPatterns\Structural\Flyweight\FlyweightFactory; /** * FlyweightTest demonstrates how a client would use the flyweight structure - * You don't have to change the code of your client + * You don't have to change the code of your client. */ class FlyweightTest extends \PHPUnit_Framework_TestCase { private $characters = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', - 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'); + 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ); private $fonts = array('Arial', 'Times New Roman', 'Verdana', 'Helvetica'); // This is about the number of characters in a book of average length @@ -31,6 +31,6 @@ class FlyweightTest extends \PHPUnit_Framework_TestCase // Flyweight pattern ensures that instances are shared // instead of having hundreds of thousands of individual objects - $this->assertLessThanOrEqual($factory->totalNumber(), sizeof($this->characters)); + $this->assertLessThanOrEqual($factory->totalNumber(), count($this->characters)); } } From ca3a8b2f29d38869fb5a10339c8f3be2bfa652cf Mon Sep 17 00:00:00 2001 From: Christophe Vidal Date: Tue, 14 Jun 2016 06:16:01 +0700 Subject: [PATCH 025/148] Fixed typo --- Structural/Adapter/README.rst | 2 +- locale/ca/LC_MESSAGES/Structural/Adapter/README.po | 2 +- locale/de/LC_MESSAGES/Structural/Adapter/README.po | 2 +- locale/es/LC_MESSAGES/Structural/Adapter/README.po | 2 +- locale/pt_BR/LC_MESSAGES/Structural/Adapter/README.po | 2 +- locale/ru/LC_MESSAGES/Structural/Adapter/README.po | 2 +- locale/zh_CN/LC_MESSAGES/Structural/Adapter/README.po | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Structural/Adapter/README.rst b/Structural/Adapter/README.rst index 1de8425..8d861d0 100644 --- a/Structural/Adapter/README.rst +++ b/Structural/Adapter/README.rst @@ -6,7 +6,7 @@ Purpose To translate one interface for a class into a compatible interface. An adapter allows classes to work together that normally could not because -of incompatible interfaces by providing it's interface to clients while +of incompatible interfaces by providing its interface to clients while using the original interface. Examples diff --git a/locale/ca/LC_MESSAGES/Structural/Adapter/README.po b/locale/ca/LC_MESSAGES/Structural/Adapter/README.po index b351fc9..21bee57 100644 --- a/locale/ca/LC_MESSAGES/Structural/Adapter/README.po +++ b/locale/ca/LC_MESSAGES/Structural/Adapter/README.po @@ -23,7 +23,7 @@ msgstr "" msgid "" "To translate one interface for a class into a compatible interface. An " "adapter allows classes to work together that normally could not because of " -"incompatible interfaces by providing it's interface to clients while using " +"incompatible interfaces by providing its interface to clients while using " "the original interface." msgstr "" diff --git a/locale/de/LC_MESSAGES/Structural/Adapter/README.po b/locale/de/LC_MESSAGES/Structural/Adapter/README.po index 4dfe1b9..f264557 100644 --- a/locale/de/LC_MESSAGES/Structural/Adapter/README.po +++ b/locale/de/LC_MESSAGES/Structural/Adapter/README.po @@ -25,7 +25,7 @@ msgstr "Zweck" msgid "" "To translate one interface for a class into a compatible interface. An " "adapter allows classes to work together that normally could not because of " -"incompatible interfaces by providing it's interface to clients while using " +"incompatible interfaces by providing its interface to clients while using " "the original interface." msgstr "" "Um ein Interface für eine Klasse in ein kompatibles Interface zu " diff --git a/locale/es/LC_MESSAGES/Structural/Adapter/README.po b/locale/es/LC_MESSAGES/Structural/Adapter/README.po index b351fc9..21bee57 100644 --- a/locale/es/LC_MESSAGES/Structural/Adapter/README.po +++ b/locale/es/LC_MESSAGES/Structural/Adapter/README.po @@ -23,7 +23,7 @@ msgstr "" msgid "" "To translate one interface for a class into a compatible interface. An " "adapter allows classes to work together that normally could not because of " -"incompatible interfaces by providing it's interface to clients while using " +"incompatible interfaces by providing its interface to clients while using " "the original interface." msgstr "" diff --git a/locale/pt_BR/LC_MESSAGES/Structural/Adapter/README.po b/locale/pt_BR/LC_MESSAGES/Structural/Adapter/README.po index b351fc9..21bee57 100644 --- a/locale/pt_BR/LC_MESSAGES/Structural/Adapter/README.po +++ b/locale/pt_BR/LC_MESSAGES/Structural/Adapter/README.po @@ -23,7 +23,7 @@ msgstr "" msgid "" "To translate one interface for a class into a compatible interface. An " "adapter allows classes to work together that normally could not because of " -"incompatible interfaces by providing it's interface to clients while using " +"incompatible interfaces by providing its interface to clients while using " "the original interface." msgstr "" diff --git a/locale/ru/LC_MESSAGES/Structural/Adapter/README.po b/locale/ru/LC_MESSAGES/Structural/Adapter/README.po index a07bbcd..fd9cb1d 100644 --- a/locale/ru/LC_MESSAGES/Structural/Adapter/README.po +++ b/locale/ru/LC_MESSAGES/Structural/Adapter/README.po @@ -25,7 +25,7 @@ msgstr "Назначение" msgid "" "To translate one interface for a class into a compatible interface. An " "adapter allows classes to work together that normally could not because of " -"incompatible interfaces by providing it's interface to clients while using " +"incompatible interfaces by providing its interface to clients while using " "the original interface." msgstr "" "Привести нестандартный или неудобный интерфейс какого-то класса в " diff --git a/locale/zh_CN/LC_MESSAGES/Structural/Adapter/README.po b/locale/zh_CN/LC_MESSAGES/Structural/Adapter/README.po index 99ac6ec..0ec1cd9 100644 --- a/locale/zh_CN/LC_MESSAGES/Structural/Adapter/README.po +++ b/locale/zh_CN/LC_MESSAGES/Structural/Adapter/README.po @@ -23,7 +23,7 @@ msgstr "目的" msgid "" "To translate one interface for a class into a compatible interface. An " "adapter allows classes to work together that normally could not because of " -"incompatible interfaces by providing it's interface to clients while using " +"incompatible interfaces by providing its interface to clients while using " "the original interface." msgstr "" "将某个类的接口转换成与另一个接口兼容。适配器通过将原始接口进行转换,给用户" From add59b3cd880a2ce57b939d7cd35c443fbcb7ef5 Mon Sep 17 00:00:00 2001 From: Kalinin Alexandr Date: Wed, 22 Jun 2016 15:58:55 +0400 Subject: [PATCH 026/148] Update Bicycle.php --- Creational/FactoryMethod/Bicycle.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Creational/FactoryMethod/Bicycle.php b/Creational/FactoryMethod/Bicycle.php index 8e41f88..fe6deee 100644 --- a/Creational/FactoryMethod/Bicycle.php +++ b/Creational/FactoryMethod/Bicycle.php @@ -13,7 +13,7 @@ class Bicycle implements VehicleInterface protected $color; /** - * sets the color of the bicycle. + * Sets the color of the bicycle. * * @param string $rgb */ From 5e872d89fff583802018cc4d12e5abe03dec30cb Mon Sep 17 00:00:00 2001 From: Jeloo Date: Thu, 23 Jun 2016 22:35:11 +0300 Subject: [PATCH 027/148] Make the method abstract on the Bridhe pattern --- Structural/Bridge/Vehicle.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Structural/Bridge/Vehicle.php b/Structural/Bridge/Vehicle.php index f519d70..80311e1 100644 --- a/Structural/Bridge/Vehicle.php +++ b/Structural/Bridge/Vehicle.php @@ -16,7 +16,5 @@ abstract class Vehicle $this->workShop2 = $workShop2; } - public function manufacture() - { - } + abstract public function manufacture(); } From 2b41a2d8013cbddb851002ca216d4c89b07cd20f Mon Sep 17 00:00:00 2001 From: "nikita.strelkov" Date: Wed, 31 Aug 2016 23:25:31 +0500 Subject: [PATCH 028/148] Translate Flyweight pattern description into Russian --- .../Structural/Flyweight/README.po | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/locale/ru/LC_MESSAGES/Structural/Flyweight/README.po b/locale/ru/LC_MESSAGES/Structural/Flyweight/README.po index 9a8b771..81f9e37 100644 --- a/locale/ru/LC_MESSAGES/Structural/Flyweight/README.po +++ b/locale/ru/LC_MESSAGES/Structural/Flyweight/README.po @@ -11,7 +11,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 23:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" +"Last-Translator: Nikita Strelkov \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -21,10 +21,12 @@ msgstr "" #: ../../Structural/Flyweight/README.rst:2 msgid "`Flyweight`__" msgstr "" +"`Приспособленец `_ " +"(`Flyweight`__)" #: ../../Structural/Flyweight/README.rst:5 msgid "Purpose" -msgstr "" +msgstr "Назначение" #: ../../Structural/Flyweight/README.rst:7 msgid "" @@ -34,36 +36,41 @@ msgid "" "external data structures and pass them to the flyweight object when " "needed." msgstr "" +"Для уменьшения использования памяти Приспособленец разделяет как можно " +"больше памяти между аналогичными объектами. Это необходимо, когда " +"используется большое количество объектов, состояние которых не сильно " +"отличается. Обычной практикой является хранение состояния во внешних " +"структурах и передавать их в объект-приспособленец, когда необходимо." #: ../../Structural/Flyweight/README.rst:12 msgid "UML Diagram" -msgstr "" +msgstr "UML Диаграмма" #: ../../Structural/Flyweight/README.rst:19 msgid "Code" -msgstr "" +msgstr "Код" #: ../../Structural/Flyweight/README.rst:21 msgid "You can also find these code on `GitHub`_" -msgstr "" +msgstr "Вы можете найти этот код на `GitHub`_" #: ../../Structural/Flyweight/README.rst:23 msgid "FlyweightInterface.php" -msgstr "" +msgstr "FlyweightInterface.php" #: ../../Structural/Flyweight/README.rst:29 msgid "CharacterFlyweight.php" -msgstr "" +msgstr "CharacterFlyweight.php" #: ../../Structural/Flyweight/README.rst:35 msgid "FlyweightFactory.php" -msgstr "" +msgstr "FlyweightFactory.php" #: ../../Structural/Flyweight/README.rst:42 msgid "Test" -msgstr "" +msgstr "Тест" #: ../../Structural/Flyweight/README.rst:44 msgid "Tests/FlyweightTest.php" -msgstr "" +msgstr "Tests/FlyweightTest.php" From a5b5ee49a131fdff67351411b66da485a9f16da6 Mon Sep 17 00:00:00 2001 From: "nikita.strelkov" Date: Thu, 1 Sep 2016 01:44:13 +0500 Subject: [PATCH 029/148] Translate Delegation pattern description into Russian --- .../ru/LC_MESSAGES/More/Delegation/README.po | 96 +++++-------------- 1 file changed, 22 insertions(+), 74 deletions(-) diff --git a/locale/ru/LC_MESSAGES/More/Delegation/README.po b/locale/ru/LC_MESSAGES/More/Delegation/README.po index 3e2676f..1fc6a2a 100644 --- a/locale/ru/LC_MESSAGES/More/Delegation/README.po +++ b/locale/ru/LC_MESSAGES/More/Delegation/README.po @@ -11,7 +11,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 23:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" +"Last-Translator: Nikita Strelkov \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -21,10 +21,12 @@ msgstr "" #: ../../More/Delegation/README.rst:2 msgid "`Delegation`__" msgstr "" +"`Делегирование `_" +"(`Delegation`__)" #: ../../More/Delegation/README.rst:5 msgid "Purpose" -msgstr "" +msgstr "Назначение" #: ../../More/Delegation/README.rst:7 msgid "" @@ -35,108 +37,54 @@ msgid "" "function. This inverts the responsibility so that Usage is unknowingly " "executing writeBadCode." msgstr "" +"В этом примере демонстрируется шаблон 'Делегирование', в котором объект, " +"вместо того чтобы выполнять одну из своих поставленных задач, поручает её " +"связанному вспомогательному объекту. В рассматриваемом ниже примере объект " +"TeamLead должен выполнять задачу writeCode, а объект Usage использовать " +"его, но при этом TeamLead перепоручает выполнение задачи writeCode функции " +"writeBadCode объекта JuniorDeveloper. Это инвертирует ответственность так, " +"что объект Usage не зная того выполняет writeBadCode." #: ../../More/Delegation/README.rst:10 msgid "Examples" -msgstr "" +msgstr "Примеры" #: ../../More/Delegation/README.rst:12 msgid "" "Please review JuniorDeveloper.php, TeamLead.php, and then Usage.php to " "see it all tied together." msgstr "" +"Просмотрите, пожалуйста, сначала JuniorDeveloper.php, TeamLead.php " +"и затем Usage.php, чтобы увидеть, как они связаны." #: ../../More/Delegation/README.rst:15 msgid "UML Diagram" -msgstr "" +msgstr "UML Диаграмма" #: ../../More/Delegation/README.rst:22 msgid "Code" -msgstr "" +msgstr "Код" #: ../../More/Delegation/README.rst:24 msgid "You can also find these code on `GitHub`_" -msgstr "" +msgstr "Вы можете найти этот код на `GitHub`_" #: ../../More/Delegation/README.rst:26 msgid "Usage.php" -msgstr "" +msgstr "Usage.php" #: ../../More/Delegation/README.rst:32 msgid "TeamLead.php" -msgstr "" +msgstr "TeamLead.php" #: ../../More/Delegation/README.rst:38 msgid "JuniorDeveloper.php" -msgstr "" +msgstr "JuniorDeveloper.php" #: ../../More/Delegation/README.rst:45 msgid "Test" -msgstr "" +msgstr "Тест" #: ../../More/Delegation/README.rst:47 msgid "Tests/DelegationTest.php" -msgstr "" - - - -#. # -#. msgid "" -#. msgstr "" -#. "Project-Id-Version: DesignPatternsPHP 1.0\n" -#. "Report-Msgid-Bugs-To: \n" -#. "POT-Creation-Date: 2015-05-29 12:18+0200\n" -#. "PO-Revision-Date: 2015-05-30 04:46+0300\n" -#. "Last-Translator: Eugene Glotov \n" -#. "MIME-Version: 1.0\n" -#. "Content-Type: text/plain; charset=UTF-8\n" -#. "Content-Transfer-Encoding: 8bit\n" -#. "Language: ru\n" -#. -#. #: ../../More/Delegation/README.rst:2 -#. msgid "`Delegation`__" -#. msgstr "`Делегирование `_ (`Delegation`__)" -#. -#. #: ../../More/Delegation/README.rst:5 -#. msgid "Purpose" -#. msgstr "Назначение" -#. -#. #: ../../More/Delegation/README.rst:7 ../../More/Delegation/README.rst:12 -#. msgid "..." -#. msgstr "Основной шаблон проектирования, в котором объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту. Шаблон делегирования является фундаментальной абстракцией, на основе которой реализованы другие шаблоны - композиция (также называемая агрегацией), примеси (mixins) и аспекты (aspects). (c) wiki" -#. -#. #: ../../More/Delegation/README.rst:10 -#. msgid "Examples" -#. msgstr "Примеры" -#. -#. #: ../../More/Delegation/README.rst:15 -#. msgid "UML Diagram" -#. msgstr "UML Диаграмма" -#. -#. #: ../../More/Delegation/README.rst:22 -#. msgid "Code" -#. msgstr "Код" -#. -#. #: ../../More/Delegation/README.rst:24 -#. msgid "You can also find these code on `GitHub`_" -#. msgstr "Вы можете найти этот код на `GitHub`_" -#. -#. #: ../../More/Delegation/README.rst:26 -#. msgid "Usage.php" -#. msgstr "Usage.php" -#. -#. #: ../../More/Delegation/README.rst:32 -#. msgid "TeamLead.php" -#. msgstr "TeamLead.php" -#. -#. #: ../../More/Delegation/README.rst:38 -#. msgid "JuniorDeveloper.php" -#. msgstr "JuniorDeveloper.php" -#. -#. #: ../../More/Delegation/README.rst:45 -#. msgid "Test" -#. msgstr "Тест" -#. -#. #: ../../More/Delegation/README.rst:47 -#. msgid "Tests/DelegationTest.php" -#. msgstr "Tests/DelegationTest.php" +msgstr "Tests/DelegationTest.php" From 162778058049fad69c936c9ce2f77aa412e265c7 Mon Sep 17 00:00:00 2001 From: "nikita.strelkov" Date: Thu, 1 Sep 2016 02:26:44 +0500 Subject: [PATCH 030/148] Translate EAV pattern description into Russian --- locale/ru/LC_MESSAGES/More/EAV/README.po | 31 +++++++++++++++--------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/locale/ru/LC_MESSAGES/More/EAV/README.po b/locale/ru/LC_MESSAGES/More/EAV/README.po index c101913..1f4c81f 100644 --- a/locale/ru/LC_MESSAGES/More/EAV/README.po +++ b/locale/ru/LC_MESSAGES/More/EAV/README.po @@ -11,7 +11,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 23:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" +"Last-Translator: Nikita Strelkov \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -20,17 +20,19 @@ msgstr "" #: ../../More/EAV/README.rst:2 msgid "`Entity-Attribute-Value (EAV)`__" -msgstr "" +msgstr "`Сущность-Артибут-Значение`__" #: ../../More/EAV/README.rst:4 msgid "" "The Entity–attribute–value (EAV) pattern in order to implement EAV model " "with PHP." msgstr "" +"Шаблон Сущность-Атрибут-Значение используется для реализации модели EAV " +"на PHP" #: ../../More/EAV/README.rst:7 msgid "Purpose" -msgstr "" +msgstr "Назначение" #: ../../More/EAV/README.rst:9 msgid "" @@ -39,40 +41,45 @@ msgid "" " be used to describe them is potentially vast, but the number that will " "actually apply to a given entity is relatively modest." msgstr "" +"Модель Сущность-Атрибут-Значение (EAV) - это модель данных, " +"предназначенная для описания сущностей, в которых количество атрибутов " +"(свойств, параметров), характеризующих их, потенциально огромно, " +"но то количество, которое реально будет использоваться в конкретной " +"сущности относительно мало." #: ../../More/EAV/README.rst:15 msgid "Examples" -msgstr "" +msgstr "Примеры" #: ../../More/EAV/README.rst:17 msgid "Check full work example in `example.php`_ file." -msgstr "" +msgstr "Смотри полный работоспособный пример в файле `example.php`_." #: ../../More/EAV/README.rst:90 msgid "UML Diagram" -msgstr "" +msgstr "UML Диаграмма" #: ../../More/EAV/README.rst:97 msgid "Code" -msgstr "" +msgstr "Code" #: ../../More/EAV/README.rst:99 msgid "You can also find these code on `GitHub`_" -msgstr "" +msgstr "Вы можете найти этот код на `GitHub`_" #: ../../More/EAV/README.rst:102 msgid "Test" -msgstr "" +msgstr "Тест" #: ../../More/EAV/README.rst:104 msgid "Tests/EntityTest.php" -msgstr "" +msgstr "Tests/EntityTest.php" #: ../../More/EAV/README.rst:110 msgid "Tests/AttributeTest.php" -msgstr "" +msgstr "Tests/AttributeTest.php" #: ../../More/EAV/README.rst:116 msgid "Tests/ValueTest.php" -msgstr "" +msgstr "Tests/ValueTest.php" From 4581b478e9c1247e48611f94e6629123511f2882 Mon Sep 17 00:00:00 2001 From: "nikita.strelkov" Date: Thu, 1 Sep 2016 14:37:55 +0500 Subject: [PATCH 031/148] Restore Eugene Glotovs translation with some fixes and additions --- .../LC_MESSAGES/Behavioral/Memento/README.po | 174 +++++------------- 1 file changed, 44 insertions(+), 130 deletions(-) diff --git a/locale/ru/LC_MESSAGES/Behavioral/Memento/README.po b/locale/ru/LC_MESSAGES/Behavioral/Memento/README.po index 5107f84..9089e6c 100644 --- a/locale/ru/LC_MESSAGES/Behavioral/Memento/README.po +++ b/locale/ru/LC_MESSAGES/Behavioral/Memento/README.po @@ -11,7 +11,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-06-03 23:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" +"Last-Translator: Eugene Glotov \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -21,10 +21,12 @@ msgstr "" #: ../../Behavioral/Memento/README.rst:2 msgid "`Memento`__" msgstr "" +"`Хранитель `_" +"(`Memento`__)" #: ../../Behavioral/Memento/README.rst:5 msgid "Purpose" -msgstr "" +msgstr "Назначение" #: ../../Behavioral/Memento/README.rst:7 msgid "" @@ -33,12 +35,18 @@ msgid "" "revealing it's implementation (i.e., the object is not required to have a" " functional for return the current state)." msgstr "" +"Шаблон предоставляет возможность восстановить объект в его предыдущем состоянии " +"(отменить действие посредством отката к предыдущему состоянию) или получить " +"доступ к состоянию объекта, не раскрывая его реализацию (т.е. сам " +"объект не обязан иметь функциональность для возврата текущего состояния)." #: ../../Behavioral/Memento/README.rst:12 msgid "" "The memento pattern is implemented with three objects: the Originator, a " "Caretaker and a Memento." msgstr "" +"Шаблон Хранитель реализуется тремя объектами: \"Создателем\" (originator), " +"\"Опекуном\" (caretaker) и \"Хранитель\" (memento)." #: ../../Behavioral/Memento/README.rst:15 msgid "" @@ -51,6 +59,14 @@ msgid "" "reference* to the original object. The Memento object is a \"opaque " "object\" (the object that no one can or should change)." msgstr "" +"Хранитель - это объект, который *хранит конкретный снимок состояния* " +"некоторого объекта или ресурса: строки, числа, массива, экземпляра " +"класса и так далее. Уникальность в данном случае подразумевает не запрет на " +"существование одинаковых состояний в разных снимках, а то, что состояние " +"можно извлечь в виде независимой копии. Любой объект, сохраняемый в " +"Хранителе, должен быть *полной копией исходного объекта, а не ссылкой* на " +"исходный объект. Сам объект Хранитель является «непрозрачным объектом» (тот, " +"который никто не может и не должен изменять)." #: ../../Behavioral/Memento/README.rst:24 msgid "" @@ -63,6 +79,14 @@ msgid "" "type of object. Originator may (but not should) have any methods, but " "they *they can't make changes to the saved object state*." msgstr "" +"Создатель — это объект, который *содержит в себе актуальное состояние внешнего " +"объекта строго заданного типа* и умеет создавать уникальную копию этого " +"состояния, возвращая её, обёрнутую в обеъкт Хранителя. Создатель не знает истории " +"изменений. Создателю можно принудительно установить конкретное состояние " +"извне, которое будет считаться актуальным. Создатель должен позаботиться о том, " +"чтобы это состояние соответствовало типу объекта, с которым ему разрешено " +"работать. Создатель может (но не обязан) иметь любые методы, но они *не могут " +"менять сохранённое состояние объекта*." #: ../../Behavioral/Memento/README.rst:33 msgid "" @@ -71,171 +95,61 @@ msgid "" "Originator; ask from the Originator snapshot of the current state; or set" " the Originator state to equivalence with some snapshot from history." msgstr "" +"Опекун *управляет историей снимков состояний*. Он может вносить изменения в " +"объект, принимать решение о сохранении состояния внешнего объекта в Создателе, " +"запрашивать от Создателя снимок текущего состояния, или привести состояние " +"Создателя в соответствие с состоянием какого-то снимка из истории." #: ../../Behavioral/Memento/README.rst:39 msgid "Examples" -msgstr "" +msgstr "Примеры" #: ../../Behavioral/Memento/README.rst:41 msgid "The seed of a pseudorandom number generator" msgstr "" +"`Зерно `_ генератора псевдослучайных " +"чисел." #: ../../Behavioral/Memento/README.rst:42 msgid "The state in a finite state machine" -msgstr "" +msgstr "Состояние конечного автомата" #: ../../Behavioral/Memento/README.rst:43 msgid "" "Control for intermediate states of `ORM Model " "`_ before saving" msgstr "" +"Контроль промежуточных состояний модели в `ORM" +"`_ перед сохранением" #: ../../Behavioral/Memento/README.rst:46 msgid "UML Diagram" -msgstr "" +msgstr "UML Диаграмма" #: ../../Behavioral/Memento/README.rst:53 msgid "Code" -msgstr "" +msgstr "Код" #: ../../Behavioral/Memento/README.rst:55 msgid "You can also find these code on `GitHub`_" -msgstr "" +msgstr "Вы можете найти этот код на `GitHub`_" #: ../../Behavioral/Memento/README.rst:57 msgid "Memento.php" -msgstr "" +msgstr "Memento.php" #: ../../Behavioral/Memento/README.rst:63 msgid "Originator.php" -msgstr "" +msgstr "Originator.php" #: ../../Behavioral/Memento/README.rst:69 msgid "Caretaker.php" -msgstr "" +msgstr "Caretaker.php" #: ../../Behavioral/Memento/README.rst:76 msgid "Test" -msgstr "" +msgstr "Тест" #: ../../Behavioral/Memento/README.rst:78 msgid "Tests/MementoTest.php" -msgstr "" - - - -#. # -#. msgid "" -#. msgstr "" -#. "Project-Id-Version: DesignPatternsPHP 1.0\n" -#. "Report-Msgid-Bugs-To: \n" -#. "POT-Creation-Date: 2015-05-29 12:18+0200\n" -#. "PO-Revision-Date: 2015-05-30 01:42+0300\n" -#. "Last-Translator: Eugene Glotov \n" -#. "MIME-Version: 1.0\n" -#. "Content-Type: text/plain; charset=UTF-8\n" -#. "Content-Transfer-Encoding: 8bit\n" -#. "Language: ru\n" -#. -#. #: ../../Behavioral/Memento/README.rst:2 -#. msgid "`Memento`__" -#. msgstr "`Хранитель`__" -#. -#. #: ../../Behavioral/Memento/README.rst:5 -#. msgid "Purpose" -#. msgstr "Назначение" -#. -#. #: ../../Behavioral/Memento/README.rst:7 -#. msgid "" -#. "Provide the ability to restore an object to its previous state (undo via " -#. "rollback)." -#. msgstr "" -#. "Предоставляет возможность восстановить объект в его предыдущем состоянии или " -#. "получить доступ к состоянию объекта, не раскрывая его реализацию (т.е. сам " -#. "объект не обязан иметь функционал возврата текущего состояния)." -#. -#. #: ../../Behavioral/Memento/README.rst:10 -#. msgid "" -#. "The memento pattern is implemented with three objects: the originator, a " -#. "caretaker and a memento. The originator is some object that has an internal " -#. "state. The caretaker is going to do something to the originator, but wants " -#. "to be able to undo the change. The caretaker first asks the originator for a" -#. " memento object. Then it does whatever operation (or sequence of operations)" -#. " it was going to do. To roll back to the state before the operations, it " -#. "returns the memento object to the originator. The memento object itself is " -#. "an opaque object (one which the caretaker cannot, or should not, change). " -#. "When using this pattern, care should be taken if the originator may change " -#. "other objects or resources - the memento pattern operates on a single " -#. "object." -#. msgstr "" -#. "Паттерн «Хранитель» реализуется тремя объектами: Создатель, Опекун и " -#. "Хранитель.\n" -#. "\n" -#. "Хранитель — объект, который *хранит конкретный уникальный слепок состояния* " -#. "любого объекта или ресурса: строка, число, массив, экземпляр класса и так " -#. "далее. Уникальность в данном случае подразумевает не запрет существования " -#. "одинаковых состояний в слепках, а то, что состояние можно извлечь в виде " -#. "независимого клона. Это значит, объект, сохраняемый в Хранитель, должен *быть " -#. "полной копией исходного объекта а не ссылкой* на исходный объект. Сам объект " -#. "Хранитель является «непрозрачным объектом» (тот, который никто не может и не " -#. "должен изменять).\n" -#. "\n" -#. "Создатель — это объект, который *содержит в себе актуальное состояние внешнего " -#. "объекта строго заданного типа* и умеет создать уникальную копию этого " -#. "состояния, возвращая её обёрнутую в Хранитель. Создатель не знает истории " -#. "изменений. Создателю можно принудительно установить конкретное состояние " -#. "извне, которое будет считаться актуальным. Создатель должен позаботиться, " -#. "чтобы это состояние соответствовало типу объекта, с которым ему разрешено " -#. "работать. Создатель может (но не обязан) иметь любые методы, но они *не могут " -#. "менять сохранённое состояние объекта*.\n" -#. "\n" -#. "Опекун *управляет историей слепков состояний*. Он может вносить изменения в " -#. "объект, принимать решение о сохранении состояния внешнего объекта в Создателе, " -#. "требовать от Создателя слепок текущего состояния, или привести состояние " -#. "Создателя в соответствие состоянию какого-то слепка из истории." -#. -#. #: ../../Behavioral/Memento/README.rst:23 -#. msgid "Examples" -#. msgstr "Примеры" -#. -#. #: ../../Behavioral/Memento/README.rst:25 -#. msgid "The seed of a pseudorandom number generator" -#. msgstr "" -#. "`Семя `_ псевдослучайного генератора " -#. "чисел." -#. -#. #: ../../Behavioral/Memento/README.rst:26 -#. msgid "The state in a finite state machine" -#. msgstr "Состояние конечного автомата" -#. -#. #: ../../Behavioral/Memento/README.rst:29 -#. msgid "UML Diagram" -#. msgstr "UML Диаграмма" -#. -#. #: ../../Behavioral/Memento/README.rst:36 -#. msgid "Code" -#. msgstr "Код" -#. -#. #: ../../Behavioral/Memento/README.rst:38 -#. msgid "You can also find these code on `GitHub`_" -#. msgstr "Вы можете найти этот код на `GitHub`_" -#. -#. #: ../../Behavioral/Memento/README.rst:40 -#. msgid "Memento.php" -#. msgstr "Memento.php" -#. -#. #: ../../Behavioral/Memento/README.rst:46 -#. msgid "Originator.php" -#. msgstr "Originator.php" -#. -#. #: ../../Behavioral/Memento/README.rst:52 -#. msgid "Caretaker.php" -#. msgstr "Caretaker.php" -#. -#. #: ../../Behavioral/Memento/README.rst:59 -#. msgid "Test" -#. msgstr "Тест" -#. -#. #: ../../Behavioral/Memento/README.rst:61 -#. msgid "Tests/MementoTest.php" -#. msgstr "Tests/MementoTest.php" +msgstr "Tests/MementoTest.php" From 3c67d5af7041d1715f7b7d1fa6ca38b29d797544 Mon Sep 17 00:00:00 2001 From: "nikita.strelkov" Date: Thu, 1 Sep 2016 15:39:42 +0500 Subject: [PATCH 032/148] Generate UML diagram for Flyweight --- Structural/Flyweight/uml/Flyweight.uml | 27 ++ Structural/Flyweight/uml/uml.png | Bin 0 -> 18579 bytes Structural/Flyweight/uml/uml.svg | 466 +++++++++++++++++++++++++ 3 files changed, 493 insertions(+) create mode 100644 Structural/Flyweight/uml/Flyweight.uml create mode 100644 Structural/Flyweight/uml/uml.png create mode 100644 Structural/Flyweight/uml/uml.svg diff --git a/Structural/Flyweight/uml/Flyweight.uml b/Structural/Flyweight/uml/Flyweight.uml new file mode 100644 index 0000000..5d53b0f --- /dev/null +++ b/Structural/Flyweight/uml/Flyweight.uml @@ -0,0 +1,27 @@ + + + PHP + \DesignPatterns\Structural\Flyweight\FlyweightFactory + + \DesignPatterns\Structural\Flyweight\CharacterFlyweight + \DesignPatterns\Structural\Flyweight\FlyweightFactory + \DesignPatterns\Structural\Flyweight\FlyweightInterface + + + + + + + + + + + + Fields + Constants + Constructors + Methods + + private + + diff --git a/Structural/Flyweight/uml/uml.png b/Structural/Flyweight/uml/uml.png new file mode 100644 index 0000000000000000000000000000000000000000..1209ab4a7a0f39de72b855d584175675b2cdfbe5 GIT binary patch literal 18579 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + name + + + + + + + + + + + + + __construct(name) + + + + + + + + + + + + + draw(font) + + + + + + + + + + + + + CharacterFlyweight + + + CharacterFlyweight + + + + + + + + + + + + + + + + name + + + + + + + + + + + + + __construct(name) + + + + + + + + + + + + + draw(font) + + + + + + + + + + + + + CharacterFlyweight + + + CharacterFlyweight + + + + + + + + + + + + + + + + + + + pool + + + + + + + + + + + + + __get(name) + + + + + + + + + + totalNumber() + + + + + + + + + + + + + FlyweightFactory + + + FlyweightFactory + + + + + + + + + + + + + + + + pool + + + + + + + + + + + + + __get(name) + + + + + + + + + + totalNumber() + + + + + + + + + + + + + FlyweightFactory + + + FlyweightFactory + + + + + + + + + + + + + + + + + + + draw(extrinsicState) + + + + + + + + + + + + + FlyweightInterface + + + FlyweightInterface + + + + + + + + + + + + + + + + draw(extrinsicState) + + + + + + + + + + + + + FlyweightInterface + + + FlyweightInterface + + + + + + + + + From 5139033d45554bbfdbad15c1828afbeeb8e48e10 Mon Sep 17 00:00:00 2001 From: shangguokan Date: Thu, 1 Sep 2016 13:48:41 +0200 Subject: [PATCH 033/148] title fix --- locale/ru/LC_MESSAGES/Behavioral/Memento/README.po | 4 +--- locale/ru/LC_MESSAGES/More/Delegation/README.po | 4 +--- locale/ru/LC_MESSAGES/Structural/Flyweight/README.po | 4 +--- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/locale/ru/LC_MESSAGES/Behavioral/Memento/README.po b/locale/ru/LC_MESSAGES/Behavioral/Memento/README.po index 9089e6c..a11f2e1 100644 --- a/locale/ru/LC_MESSAGES/Behavioral/Memento/README.po +++ b/locale/ru/LC_MESSAGES/Behavioral/Memento/README.po @@ -20,9 +20,7 @@ msgstr "" #: ../../Behavioral/Memento/README.rst:2 msgid "`Memento`__" -msgstr "" -"`Хранитель `_" -"(`Memento`__)" +msgstr "`Хранитель `_ (`Memento`__)" #: ../../Behavioral/Memento/README.rst:5 msgid "Purpose" diff --git a/locale/ru/LC_MESSAGES/More/Delegation/README.po b/locale/ru/LC_MESSAGES/More/Delegation/README.po index 1fc6a2a..a0e0312 100644 --- a/locale/ru/LC_MESSAGES/More/Delegation/README.po +++ b/locale/ru/LC_MESSAGES/More/Delegation/README.po @@ -20,9 +20,7 @@ msgstr "" #: ../../More/Delegation/README.rst:2 msgid "`Delegation`__" -msgstr "" -"`Делегирование `_" -"(`Delegation`__)" +msgstr "`Делегирование `_ (`Delegation`__)" #: ../../More/Delegation/README.rst:5 msgid "Purpose" diff --git a/locale/ru/LC_MESSAGES/Structural/Flyweight/README.po b/locale/ru/LC_MESSAGES/Structural/Flyweight/README.po index 81f9e37..a8f0879 100644 --- a/locale/ru/LC_MESSAGES/Structural/Flyweight/README.po +++ b/locale/ru/LC_MESSAGES/Structural/Flyweight/README.po @@ -20,9 +20,7 @@ msgstr "" #: ../../Structural/Flyweight/README.rst:2 msgid "`Flyweight`__" -msgstr "" -"`Приспособленец `_ " -"(`Flyweight`__)" +msgstr "`Приспособленец `_ (`Flyweight`__)" #: ../../Structural/Flyweight/README.rst:5 msgid "Purpose" From f281f412c45fe2d87417cf5d42d2f0ae15fa3395 Mon Sep 17 00:00:00 2001 From: Diogo Alexsander Cavilha Date: Fri, 9 Sep 2016 10:17:41 -0300 Subject: [PATCH 034/148] Update DateComparator.php --- Behavioral/Strategy/DateComparator.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Behavioral/Strategy/DateComparator.php b/Behavioral/Strategy/DateComparator.php index bc7ffea..15c2f20 100644 --- a/Behavioral/Strategy/DateComparator.php +++ b/Behavioral/Strategy/DateComparator.php @@ -17,8 +17,8 @@ class DateComparator implements ComparatorInterface if ($aDate == $bDate) { return 0; - } else { - return $aDate < $bDate ? -1 : 1; } + + return $aDate < $bDate ? -1 : 1; } } From 5189a7342c5b513e5ff3415c94e02c85e77f4213 Mon Sep 17 00:00:00 2001 From: James LaChance Date: Sat, 17 Sep 2016 23:51:58 -0400 Subject: [PATCH 035/148] DRY things up a bit --- Structural/DataMapper/User.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Structural/DataMapper/User.php b/Structural/DataMapper/User.php index 8d8d2b2..f3f7661 100644 --- a/Structural/DataMapper/User.php +++ b/Structural/DataMapper/User.php @@ -33,9 +33,9 @@ class User */ public function __construct($id = null, $username = null, $email = null) { - $this->userId = $id; - $this->username = $username; - $this->email = $email; + $this->setUserID($id); + $this->setUsername($username); + $this->setEmail($email); } /** From 118c37adabd58e5774517957235f11f0db5de9d7 Mon Sep 17 00:00:00 2001 From: James LaChance Date: Sun, 18 Sep 2016 12:54:11 -0400 Subject: [PATCH 036/148] DRY more things! --- More/EAV/Value.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/More/EAV/Value.php b/More/EAV/Value.php index 2c156a9..da4370f 100644 --- a/More/EAV/Value.php +++ b/More/EAV/Value.php @@ -22,8 +22,7 @@ class Value implements ValueInterface */ public function __construct(Attribute $attribute) { - $attribute->addValue($this); - $this->attribute = $attribute; + $this->setAttribute($attribute); } /** @@ -33,7 +32,7 @@ class Value implements ValueInterface */ public function setAttribute(Attribute $attribute) { - $this->attribute->removeValue($this); // Remove value from current attribute + $this->attribute && $this->attribute->removeValue($this); // Remove value from current attribute $attribute->addValue($this); // Add value to new attribute $this->attribute = $attribute; From d5b8a5642536bfbdda7c37eb2842e09228ab3f82 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Wed, 21 Sep 2016 14:34:24 +0200 Subject: [PATCH 037/148] #232 removed Iterator classes --- Behavioral/Iterator/Book.php | 14 +- Behavioral/Iterator/BookList.php | 44 +- Behavioral/Iterator/BookListIterator.php | 86 --- .../Iterator/BookListReverseIterator.php | 87 --- Behavioral/Iterator/README.rst | 17 +- Behavioral/Iterator/Tests/IteratorTest.php | 94 +-- composer.json | 5 +- composer.lock | 577 ++++++++++++++---- 8 files changed, 562 insertions(+), 362 deletions(-) delete mode 100644 Behavioral/Iterator/BookListIterator.php delete mode 100644 Behavioral/Iterator/BookListReverseIterator.php diff --git a/Behavioral/Iterator/Book.php b/Behavioral/Iterator/Book.php index b1adf7f..bb9abeb 100644 --- a/Behavioral/Iterator/Book.php +++ b/Behavioral/Iterator/Book.php @@ -4,27 +4,33 @@ namespace DesignPatterns\Behavioral\Iterator; class Book { + /** + * @var string + */ private $author; + /** + * @var string + */ private $title; - public function __construct($title, $author) + public function __construct(string $title, string $author) { $this->author = $author; $this->title = $title; } - public function getAuthor() + public function getAuthor(): string { return $this->author; } - public function getTitle() + public function getTitle(): string { return $this->title; } - public function getAuthorAndTitle() + public function getAuthorAndTitle(): string { return $this->getTitle().' by '.$this->getAuthor(); } diff --git a/Behavioral/Iterator/BookList.php b/Behavioral/Iterator/BookList.php index 6cc5e5e..e69825f 100644 --- a/Behavioral/Iterator/BookList.php +++ b/Behavioral/Iterator/BookList.php @@ -2,18 +2,17 @@ namespace DesignPatterns\Behavioral\Iterator; -class BookList implements \Countable +class BookList implements \Countable, \Iterator { + /** + * @var Book[] + */ private $books; - public function getBook($bookNumberToGet) - { - if (isset($this->books[$bookNumberToGet])) { - return $this->books[$bookNumberToGet]; - } - - return; - } + /** + * @var int + */ + private $currentIndex = 0; public function addBook(Book $book) { @@ -30,8 +29,33 @@ class BookList implements \Countable } } - public function count() + public function count(): int { return count($this->books); } + + public function current(): Book + { + return $this->books[array_keys($this->books)[$this->currentIndex]]; + } + + public function key(): int + { + return array_keys($this->books)[$this->currentIndex]; + } + + public function next() + { + $this->currentIndex++; + } + + public function rewind() + { + $this->currentIndex = 0; + } + + public function valid(): bool + { + return isset(array_keys($this->books)[$this->currentIndex]); + } } diff --git a/Behavioral/Iterator/BookListIterator.php b/Behavioral/Iterator/BookListIterator.php deleted file mode 100644 index ecedba6..0000000 --- a/Behavioral/Iterator/BookListIterator.php +++ /dev/null @@ -1,86 +0,0 @@ -bookList = $bookList; - } - - /** - * Return the current book. - * - * @link http://php.net/manual/en/iterator.current.php - * - * @return Book Can return any type. - */ - public function current() - { - return $this->bookList->getBook($this->currentBook); - } - - /** - * (PHP 5 >= 5.0.0)
- * Move forward to next element. - * - * @link http://php.net/manual/en/iterator.next.php - * - * @return void Any returned value is ignored. - */ - public function next() - { - $this->currentBook++; - } - - /** - * (PHP 5 >= 5.0.0)
- * Return the key of the current element. - * - * @link http://php.net/manual/en/iterator.key.php - * - * @return mixed scalar on success, or null on failure. - */ - public function key() - { - return $this->currentBook; - } - - /** - * (PHP 5 >= 5.0.0)
- * Checks if current position is valid. - * - * @link http://php.net/manual/en/iterator.valid.php - * - * @return bool The return value will be casted to boolean and then evaluated. - * Returns true on success or false on failure. - */ - public function valid() - { - return null !== $this->bookList->getBook($this->currentBook); - } - - /** - * (PHP 5 >= 5.0.0)
- * Rewind the Iterator to the first element. - * - * @link http://php.net/manual/en/iterator.rewind.php - * - * @return void Any returned value is ignored. - */ - public function rewind() - { - $this->currentBook = 0; - } -} diff --git a/Behavioral/Iterator/BookListReverseIterator.php b/Behavioral/Iterator/BookListReverseIterator.php deleted file mode 100644 index 94f34d9..0000000 --- a/Behavioral/Iterator/BookListReverseIterator.php +++ /dev/null @@ -1,87 +0,0 @@ -bookList = $bookList; - $this->currentBook = $this->bookList->count() - 1; - } - - /** - * Return the current book. - * - * @link http://php.net/manual/en/iterator.current.php - * - * @return Book Can return any type. - */ - public function current() - { - return $this->bookList->getBook($this->currentBook); - } - - /** - * (PHP 5 >= 5.0.0)
- * Move forward to next element. - * - * @link http://php.net/manual/en/iterator.next.php - * - * @return void Any returned value is ignored. - */ - public function next() - { - $this->currentBook--; - } - - /** - * (PHP 5 >= 5.0.0)
- * Return the key of the current element. - * - * @link http://php.net/manual/en/iterator.key.php - * - * @return mixed scalar on success, or null on failure. - */ - public function key() - { - return $this->currentBook; - } - - /** - * (PHP 5 >= 5.0.0)
- * Checks if current position is valid. - * - * @link http://php.net/manual/en/iterator.valid.php - * - * @return bool The return value will be casted to boolean and then evaluated. - * Returns true on success or false on failure. - */ - public function valid() - { - return null !== $this->bookList->getBook($this->currentBook); - } - - /** - * (PHP 5 >= 5.0.0)
- * Rewind the Iterator to the first element. - * - * @link http://php.net/manual/en/iterator.rewind.php - * - * @return void Any returned value is ignored. - */ - public function rewind() - { - $this->currentBook = $this->bookList->count() - 1; - } -} diff --git a/Behavioral/Iterator/README.rst b/Behavioral/Iterator/README.rst index 9398350..cb7134b 100644 --- a/Behavioral/Iterator/README.rst +++ b/Behavioral/Iterator/README.rst @@ -4,8 +4,7 @@ Purpose ------- -To make an object iterable and to make it appear like a collection of -objects. +To make an object iterable and to make it appear like a collection of objects. Examples -------- @@ -45,18 +44,6 @@ BookList.php :language: php :linenos: -BookListIterator.php - -.. literalinclude:: BookListIterator.php - :language: php - :linenos: - -BookListReverseIterator.php - -.. literalinclude:: BookListReverseIterator.php - :language: php - :linenos: - Test ---- @@ -67,4 +54,4 @@ Tests/IteratorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Iterator -.. __: http://en.wikipedia.org/wiki/Iterator_pattern \ No newline at end of file +.. __: http://en.wikipedia.org/wiki/Iterator_pattern diff --git a/Behavioral/Iterator/Tests/IteratorTest.php b/Behavioral/Iterator/Tests/IteratorTest.php index db386f0..78ba617 100644 --- a/Behavioral/Iterator/Tests/IteratorTest.php +++ b/Behavioral/Iterator/Tests/IteratorTest.php @@ -9,66 +9,68 @@ use DesignPatterns\Behavioral\Iterator\BookListReverseIterator; class IteratorTest extends \PHPUnit_Framework_TestCase { - /** - * @var BookList - */ - protected $bookList; - - protected function setUp() + public function testCanIterateOverBookList() { - $this->bookList = new BookList(); - $this->bookList->addBook(new Book('Learning PHP Design Patterns', 'William Sanders')); - $this->bookList->addBook(new Book('Professional Php Design Patterns', 'Aaron Saray')); - $this->bookList->addBook(new Book('Clean Code', 'Robert C. Martin')); - } + $bookList = new BookList(); + $bookList->addBook(new Book('Learning PHP Design Patterns', 'William Sanders')); + $bookList->addBook(new Book('Professional Php Design Patterns', 'Aaron Saray')); + $bookList->addBook(new Book('Clean Code', 'Robert C. Martin')); - public function expectedAuthors() - { - return array( - array( - array( - 'Learning PHP Design Patterns by William Sanders', - 'Professional Php Design Patterns by Aaron Saray', - 'Clean Code by Robert C. Martin', - ), - ), + $books = []; + + foreach ($bookList as $book) { + $books[] = $book->getAuthorAndTitle(); + } + + $this->assertEquals( + [ + 'Learning PHP Design Patterns by William Sanders', + 'Professional Php Design Patterns by Aaron Saray', + 'Clean Code by Robert C. Martin', + ], + $books ); } - /** - * @dataProvider expectedAuthors - */ - public function testUseAIteratorAndValidateAuthors($expected) + public function testCanIterateOverBookListAfterRemovingBook() { - $iterator = new BookListIterator($this->bookList); + $book = new Book('Clean Code', 'Robert C. Martin'); + $book2 = new Book('Professional Php Design Patterns', 'Aaron Saray'); - while ($iterator->valid()) { - $expectedBook = array_shift($expected); - $this->assertEquals($expectedBook, $iterator->current()->getAuthorAndTitle()); - $iterator->next(); + $bookList = new BookList(); + $bookList->addBook($book); + $bookList->addBook($book2); + $bookList->removeBook($book); + + $books = []; + foreach ($bookList as $book) { + $books[] = $book->getAuthorAndTitle(); } + + $this->assertEquals( + ['Professional Php Design Patterns by Aaron Saray'], + $books + ); } - /** - * @dataProvider expectedAuthors - */ - public function testUseAReverseIteratorAndValidateAuthors($expected) + public function testCanAddBookToList() { - $iterator = new BookListReverseIterator($this->bookList); + $book = new Book('Clean Code', 'Robert C. Martin'); - while ($iterator->valid()) { - $expectedBook = array_pop($expected); - $this->assertEquals($expectedBook, $iterator->current()->getAuthorAndTitle()); - $iterator->next(); - } + $bookList = new BookList(); + $bookList->addBook($book); + + $this->assertCount(1, $bookList); } - /** - * Test BookList Remove. - */ - public function testBookRemove() + public function testCanRemoveBookFromList() { - $this->bookList->removeBook($this->bookList->getBook(0)); - $this->assertEquals($this->bookList->count(), 2); + $book = new Book('Clean Code', 'Robert C. Martin'); + + $bookList = new BookList(); + $bookList->addBook($book); + $bookList->removeBook($book); + + $this->assertCount(0, $bookList); } } diff --git a/composer.json b/composer.json index 71610e4..3bac6dc 100644 --- a/composer.json +++ b/composer.json @@ -8,8 +8,11 @@ } ], "minimum-stability": "stable", + "require": { + "php": ">=7.0" + }, "require-dev": { - "phpunit/phpunit": "^4.6", + "phpunit/phpunit": ">=5.5.4", "squizlabs/php_codesniffer": "1.5.*" }, "autoload": { diff --git a/composer.lock b/composer.lock index 202b73e..2f6aac1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "ccc9bc820717ca4dc310248ad4a69f21", - "content-hash": "f9ca7d34db86fa55e8dc649f84d8b4c7", + "hash": "fc06bf31eb6cf4b21a7923e186abfb9d", + "content-hash": "c829a84cbe749d776139a3e9ebdd3094", "packages": [], "packages-dev": [ { @@ -63,38 +63,129 @@ "time": "2015-06-14 21:17:01" }, { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", + "name": "myclabs/deep-copy", + "version": "1.5.4", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "ea74994a3dc7f8d2f65a06009348f2d63c81e61f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/ea74994a3dc7f8d2f65a06009348f2d63c81e61f", + "reference": "ea74994a3dc7f8d2f65a06009348f2d63c81e61f", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "doctrine/collections": "1.*", + "phpunit/phpunit": "~4.1" }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "homepage": "https://github.com/myclabs/DeepCopy", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2016-09-16 13:37:59" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "psr-0": { - "phpDocumentor": [ + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2015-12-27 11:43:31" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "9270140b940ff02e58ec577c237274e92cd40cdd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9270140b940ff02e58ec577c237274e92cd40cdd", + "reference": "9270140b940ff02e58ec577c237274e92cd40cdd", + "shasum": "" + }, + "require": { + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0@dev", + "phpdocumentor/type-resolver": "^0.2.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ "src/" ] } @@ -106,37 +197,87 @@ "authors": [ { "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" + "email": "me@mikevanriel.com" } ], - "time": "2015-02-03 12:10:50" + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2016-06-10 09:48:41" }, { - "name": "phpspec/prophecy", - "version": "v1.5.0", + "name": "phpdocumentor/type-resolver", + "version": "0.2", "source": { "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7" + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4745ded9307786b730d7a60df5cb5a6c43cf95f7", - "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443", + "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "phpdocumentor/reflection-docblock": "~2.0", - "sebastian/comparator": "~1.1" + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0" }, "require-dev": { - "phpspec/phpspec": "~2.0" + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "time": "2016-06-10 07:14:17" + }, + { + "name": "phpspec/prophecy", + "version": "v1.6.1", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "58a8137754bc24b25740d4281399a4a3596058e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0", + "reference": "58a8137754bc24b25740d4281399a4a3596058e0", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", + "sebastian/comparator": "^1.1", + "sebastian/recursion-context": "^1.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" } }, "autoload": { @@ -169,43 +310,44 @@ "spy", "stub" ], - "time": "2015-08-13 10:07:40" + "time": "2016-06-07 08:13:47" }, { "name": "phpunit/php-code-coverage", - "version": "2.2.4", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" + "reference": "5f3f7e736d6319d5f1fc402aff8b026da26709a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5f3f7e736d6319d5f1fc402aff8b026da26709a3", + "reference": "5f3f7e736d6319d5f1fc402aff8b026da26709a3", "shasum": "" }, "require": { - "php": ">=5.3.3", + "php": "^5.6 || ^7.0", "phpunit/php-file-iterator": "~1.3", "phpunit/php-text-template": "~1.2", - "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "^1.3.2", - "sebastian/version": "~1.0" + "phpunit/php-token-stream": "^1.4.2", + "sebastian/code-unit-reverse-lookup": "~1.0", + "sebastian/environment": "^1.3.2 || ^2.0", + "sebastian/version": "~1.0|~2.0" }, "require-dev": { "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4" + "phpunit/phpunit": "^5.4" }, "suggest": { "ext-dom": "*", - "ext-xdebug": ">=2.2.1", + "ext-xdebug": ">=2.4.0", "ext-xmlwriter": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2.x-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { @@ -231,7 +373,7 @@ "testing", "xunit" ], - "time": "2015-10-06 15:47:00" + "time": "2016-07-26 14:39:29" }, { "name": "phpunit/php-file-iterator", @@ -323,21 +465,24 @@ }, { "name": "phpunit/php-timer", - "version": "1.0.7", + "version": "1.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" + "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", + "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "require-dev": { + "phpunit/phpunit": "~4|~5" + }, "type": "library", "autoload": { "classmap": [ @@ -360,7 +505,7 @@ "keywords": [ "timer" ], - "time": "2015-06-21 08:01:12" + "time": "2016-05-12 18:03:57" }, { "name": "phpunit/php-token-stream", @@ -413,16 +558,16 @@ }, { "name": "phpunit/phpunit", - "version": "4.8.18", + "version": "5.5.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "fa33d4ad96481b91df343d83e8c8aabed6b1dfd3" + "reference": "3e6e88e56c912133de6e99b87728cca7ed70c5f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fa33d4ad96481b91df343d83e8c8aabed6b1dfd3", - "reference": "fa33d4ad96481b91df343d83e8c8aabed6b1dfd3", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6e88e56c912133de6e99b87728cca7ed70c5f5", + "reference": "3e6e88e56c912133de6e99b87728cca7ed70c5f5", "shasum": "" }, "require": { @@ -431,21 +576,27 @@ "ext-pcre": "*", "ext-reflection": "*", "ext-spl": "*", - "php": ">=5.3.3", + "myclabs/deep-copy": "~1.3", + "php": "^5.6 || ^7.0", "phpspec/prophecy": "^1.3.1", - "phpunit/php-code-coverage": "~2.1", + "phpunit/php-code-coverage": "^4.0.1", "phpunit/php-file-iterator": "~1.4", "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": ">=1.0.6", - "phpunit/phpunit-mock-objects": "~2.3", + "phpunit/php-timer": "^1.0.6", + "phpunit/phpunit-mock-objects": "^3.2", "sebastian/comparator": "~1.1", "sebastian/diff": "~1.2", - "sebastian/environment": "~1.3", + "sebastian/environment": "^1.3 || ^2.0", "sebastian/exporter": "~1.2", "sebastian/global-state": "~1.0", - "sebastian/version": "~1.0", + "sebastian/object-enumerator": "~1.0", + "sebastian/resource-operations": "~1.0", + "sebastian/version": "~1.0|~2.0", "symfony/yaml": "~2.1|~3.0" }, + "conflict": { + "phpdocumentor/reflection-docblock": "3.0.2" + }, "suggest": { "phpunit/php-invoker": "~1.1" }, @@ -455,7 +606,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.8.x-dev" + "dev-master": "5.5.x-dev" } }, "autoload": { @@ -481,30 +632,33 @@ "testing", "xunit" ], - "time": "2015-11-11 11:32:49" + "time": "2016-08-26 07:11:44" }, { "name": "phpunit/phpunit-mock-objects", - "version": "2.3.8", + "version": "3.2.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" + "reference": "546898a2c0c356ef2891b39dd7d07f5d82c8ed0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/546898a2c0c356ef2891b39dd7d07f5d82c8ed0a", + "reference": "546898a2c0c356ef2891b39dd7d07f5d82c8ed0a", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", - "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2", - "sebastian/exporter": "~1.2" + "php": "^5.6 || ^7.0", + "phpunit/php-text-template": "^1.2", + "sebastian/exporter": "^1.2" + }, + "conflict": { + "phpunit/phpunit": "<5.4.0" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^5.4" }, "suggest": { "ext-soap": "*" @@ -512,7 +666,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3.x-dev" + "dev-master": "3.2.x-dev" } }, "autoload": { @@ -537,7 +691,52 @@ "mock", "xunit" ], - "time": "2015-10-02 06:51:40" + "time": "2016-09-06 16:07:45" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/c36f5e7cfce482fde5bf8d10d41a53591e0198fe", + "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "~5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2016-02-13 06:45:14" }, { "name": "sebastian/comparator", @@ -605,28 +804,28 @@ }, { "name": "sebastian/diff", - "version": "1.3.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3", - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { - "phpunit/phpunit": "~4.2" + "phpunit/phpunit": "~4.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.4-dev" } }, "autoload": { @@ -649,31 +848,31 @@ } ], "description": "Diff implementation", - "homepage": "http://www.github.com/sebastianbergmann/diff", + "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ "diff" ], - "time": "2015-02-22 15:13:53" + "time": "2015-12-08 07:14:41" }, { "name": "sebastian/environment", - "version": "1.3.2", + "version": "1.3.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44" + "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6324c907ce7a52478eeeaede764f48733ef5ae44", - "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea", + "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^4.8 || ^5.0" }, "type": "library", "extra": { @@ -703,20 +902,20 @@ "environment", "hhvm" ], - "time": "2015-08-03 06:14:51" + "time": "2016-08-18 05:49:44" }, { "name": "sebastian/exporter", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e" + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", "shasum": "" }, "require": { @@ -724,12 +923,13 @@ "sebastian/recursion-context": "~1.0" }, "require-dev": { + "ext-mbstring": "*", "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -769,7 +969,7 @@ "export", "exporter" ], - "time": "2015-06-21 07:55:53" + "time": "2016-06-17 09:04:28" }, { "name": "sebastian/global-state", @@ -823,17 +1023,63 @@ "time": "2015-10-12 03:26:01" }, { - "name": "sebastian/recursion-context", - "version": "1.0.1", + "name": "sebastian/object-enumerator", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "994d4a811bafe801fb06dccbee797863ba2792ba" + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "d4ca2fb70344987502567bc50081c03e6192fb26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba", - "reference": "994d4a811bafe801fb06dccbee797863ba2792ba", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/d4ca2fb70344987502567bc50081c03e6192fb26", + "reference": "d4ca2fb70344987502567bc50081c03e6192fb26", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2016-01-28 13:25:10" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "913401df809e99e4f47b27cdd781f4a258d58791" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791", + "reference": "913401df809e99e4f47b27cdd781f4a258d58791", "shasum": "" }, "require": { @@ -873,23 +1119,73 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2015-06-21 08:04:50" + "time": "2015-11-11 19:50:13" }, { - "name": "sebastian/version", - "version": "1.0.6", + "name": "sebastian/resource-operations", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", "shasum": "" }, + "require": { + "php": ">=5.6.0" + }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2015-07-28 20:34:47" + }, + { + "name": "sebastian/version", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5", + "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -908,7 +1204,7 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2015-06-21 13:59:46" + "time": "2016-02-04 12:56:52" }, { "name": "squizlabs/php_codesniffer", @@ -987,31 +1283,34 @@ }, { "name": "symfony/yaml", - "version": "v2.7.6", + "version": "v3.1.4", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "eca9019c88fbe250164affd107bc8057771f3f4d" + "reference": "f291ed25eb1435bddbe8a96caaef16469c2a092d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/eca9019c88fbe250164affd107bc8057771f3f4d", - "reference": "eca9019c88fbe250164affd107bc8057771f3f4d", + "url": "https://api.github.com/repos/symfony/yaml/zipball/f291ed25eb1435bddbe8a96caaef16469c2a092d", + "reference": "f291ed25eb1435bddbe8a96caaef16469c2a092d", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": ">=5.5.9" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "3.1-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Yaml\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1029,7 +1328,57 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2015-10-11 09:39:48" + "time": "2016-09-02 02:12:52" + }, + { + "name": "webmozart/assert", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "bb2d123231c095735130cc8f6d31385a44c7b308" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/bb2d123231c095735130cc8f6d31385a44c7b308", + "reference": "bb2d123231c095735130cc8f6d31385a44c7b308", + "shasum": "" + }, + "require": { + "php": "^5.3.3|^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2016-08-09 15:02:57" } ], "aliases": [], @@ -1037,6 +1386,8 @@ "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, - "platform": [], + "platform": { + "php": ">=7.0" + }, "platform-dev": [] } From 7e2702ba9374c4270cacedf84cbbfbb6822a7c97 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Wed, 21 Sep 2016 14:42:16 +0200 Subject: [PATCH 038/148] removed old PHP versions from travis build --- .travis.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9f379f8..cb88b17 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,17 +3,10 @@ language: php sudo: false php: - - 5.3 - - 5.4 - - 5.5 - - 5.6 - 7.0 - - hhvm + - 7.1 matrix: - allow_failures: - - php: hhvm - - php: 7.0 fast_finish: true cache: From 1ff4203bebab4b6fc4df0980dd180d4267317b8a Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Wed, 21 Sep 2016 14:58:49 +0200 Subject: [PATCH 039/148] fixed translation --- locale/ca/LC_MESSAGES/Behavioral/Iterator/README.po | 6 ++---- locale/es/LC_MESSAGES/Behavioral/Iterator/README.po | 6 ++---- locale/pt_BR/LC_MESSAGES/Behavioral/Iterator/README.po | 6 ++---- locale/ru/LC_MESSAGES/Behavioral/Iterator/README.po | 4 +--- locale/zh_CN/LC_MESSAGES/Behavioral/Iterator/README.po | 6 ++---- 5 files changed, 9 insertions(+), 19 deletions(-) diff --git a/locale/ca/LC_MESSAGES/Behavioral/Iterator/README.po b/locale/ca/LC_MESSAGES/Behavioral/Iterator/README.po index 3000658..34ecd7d 100644 --- a/locale/ca/LC_MESSAGES/Behavioral/Iterator/README.po +++ b/locale/ca/LC_MESSAGES/Behavioral/Iterator/README.po @@ -1,4 +1,4 @@ -# +# msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" @@ -20,9 +20,7 @@ msgid "Purpose" msgstr "" #: ../../Behavioral/Iterator/README.rst:7 -msgid "" -"To make an object iterable and to make it appear like a collection of " -"objects." +msgid "To make an object iterable and to make it appear like a collection of objects." msgstr "" #: ../../Behavioral/Iterator/README.rst:11 diff --git a/locale/es/LC_MESSAGES/Behavioral/Iterator/README.po b/locale/es/LC_MESSAGES/Behavioral/Iterator/README.po index 3000658..34ecd7d 100644 --- a/locale/es/LC_MESSAGES/Behavioral/Iterator/README.po +++ b/locale/es/LC_MESSAGES/Behavioral/Iterator/README.po @@ -1,4 +1,4 @@ -# +# msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" @@ -20,9 +20,7 @@ msgid "Purpose" msgstr "" #: ../../Behavioral/Iterator/README.rst:7 -msgid "" -"To make an object iterable and to make it appear like a collection of " -"objects." +msgid "To make an object iterable and to make it appear like a collection of objects." msgstr "" #: ../../Behavioral/Iterator/README.rst:11 diff --git a/locale/pt_BR/LC_MESSAGES/Behavioral/Iterator/README.po b/locale/pt_BR/LC_MESSAGES/Behavioral/Iterator/README.po index 3000658..1212041 100644 --- a/locale/pt_BR/LC_MESSAGES/Behavioral/Iterator/README.po +++ b/locale/pt_BR/LC_MESSAGES/Behavioral/Iterator/README.po @@ -1,4 +1,4 @@ -# +# msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" @@ -20,9 +20,7 @@ msgid "Purpose" msgstr "" #: ../../Behavioral/Iterator/README.rst:7 -msgid "" -"To make an object iterable and to make it appear like a collection of " -"objects." +msgid To make an object iterable and to make it appear like a collection of objects." msgstr "" #: ../../Behavioral/Iterator/README.rst:11 diff --git a/locale/ru/LC_MESSAGES/Behavioral/Iterator/README.po b/locale/ru/LC_MESSAGES/Behavioral/Iterator/README.po index 1d5061d..37fa467 100644 --- a/locale/ru/LC_MESSAGES/Behavioral/Iterator/README.po +++ b/locale/ru/LC_MESSAGES/Behavioral/Iterator/README.po @@ -20,9 +20,7 @@ msgid "Purpose" msgstr "Назначение" #: ../../Behavioral/Iterator/README.rst:7 -msgid "" -"To make an object iterable and to make it appear like a collection of " -"objects." +msgid "To make an object iterable and to make it appear like a collection of objects." msgstr "" "Добавить коллекции объектов функционал последовательного доступа к " "содержащимся в ней экземплярам объектов без реализации этого функционала в " diff --git a/locale/zh_CN/LC_MESSAGES/Behavioral/Iterator/README.po b/locale/zh_CN/LC_MESSAGES/Behavioral/Iterator/README.po index 3000658..1212041 100644 --- a/locale/zh_CN/LC_MESSAGES/Behavioral/Iterator/README.po +++ b/locale/zh_CN/LC_MESSAGES/Behavioral/Iterator/README.po @@ -1,4 +1,4 @@ -# +# msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" @@ -20,9 +20,7 @@ msgid "Purpose" msgstr "" #: ../../Behavioral/Iterator/README.rst:7 -msgid "" -"To make an object iterable and to make it appear like a collection of " -"objects." +msgid To make an object iterable and to make it appear like a collection of objects." msgstr "" #: ../../Behavioral/Iterator/README.rst:11 From 3d6db19db3cb4ea0947ff23427f253431b5e3267 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Wed, 21 Sep 2016 15:03:31 +0200 Subject: [PATCH 040/148] fixed grammar --- Behavioral/Observer/README.rst | 4 ++-- locale/ca/LC_MESSAGES/Behavioral/Observer/README.po | 4 ++-- locale/de/LC_MESSAGES/Behavioral/Observer/README.po | 2 +- locale/es/LC_MESSAGES/Behavioral/Observer/README.po | 4 ++-- locale/pt_BR/LC_MESSAGES/Behavioral/Observer/README.po | 4 ++-- locale/ru/LC_MESSAGES/Behavioral/Observer/README.po | 2 +- locale/zh_CN/LC_MESSAGES/Behavioral/Observer/README.po | 4 ++-- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Behavioral/Observer/README.rst b/Behavioral/Observer/README.rst index 53398c2..b6c47dc 100644 --- a/Behavioral/Observer/README.rst +++ b/Behavioral/Observer/README.rst @@ -5,7 +5,7 @@ Purpose ------- To implement a publish/subscribe behaviour to an object, whenever a -"Subject" object changes it's state, the attached "Observers" will be +"Subject" object changes its state, the attached "Observers" will be notified. It is used to shorten the amount of coupled objects and uses loose coupling instead. @@ -55,4 +55,4 @@ Tests/ObserverTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Observer -.. __: http://en.wikipedia.org/wiki/Observer_pattern \ No newline at end of file +.. __: http://en.wikipedia.org/wiki/Observer_pattern diff --git a/locale/ca/LC_MESSAGES/Behavioral/Observer/README.po b/locale/ca/LC_MESSAGES/Behavioral/Observer/README.po index 6aea8e9..5119740 100644 --- a/locale/ca/LC_MESSAGES/Behavioral/Observer/README.po +++ b/locale/ca/LC_MESSAGES/Behavioral/Observer/README.po @@ -1,4 +1,4 @@ -# +# msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" @@ -22,7 +22,7 @@ msgstr "" #: ../../Behavioral/Observer/README.rst:7 msgid "" "To implement a publish/subscribe behaviour to an object, whenever a " -"\"Subject\" object changes it's state, the attached \"Observers\" will be " +"\"Subject\" object changes its state, the attached \"Observers\" will be " "notified. It is used to shorten the amount of coupled objects and uses loose" " coupling instead." msgstr "" diff --git a/locale/de/LC_MESSAGES/Behavioral/Observer/README.po b/locale/de/LC_MESSAGES/Behavioral/Observer/README.po index c373b7d..d0d3767 100644 --- a/locale/de/LC_MESSAGES/Behavioral/Observer/README.po +++ b/locale/de/LC_MESSAGES/Behavioral/Observer/README.po @@ -23,7 +23,7 @@ msgstr "Zweck" #: ../../Behavioral/Observer/README.rst:7 msgid "" -"To implement a publish/subscribe behaviour to an object, whenever a \"Subject\" object changes it's " +"To implement a publish/subscribe behaviour to an object, whenever a \"Subject\" object changes its " "state, the attached \"Observers\" will be notified. It is used to shorten the amount of coupled objects " "and uses loose coupling instead." msgstr "" diff --git a/locale/es/LC_MESSAGES/Behavioral/Observer/README.po b/locale/es/LC_MESSAGES/Behavioral/Observer/README.po index 6aea8e9..5119740 100644 --- a/locale/es/LC_MESSAGES/Behavioral/Observer/README.po +++ b/locale/es/LC_MESSAGES/Behavioral/Observer/README.po @@ -1,4 +1,4 @@ -# +# msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" @@ -22,7 +22,7 @@ msgstr "" #: ../../Behavioral/Observer/README.rst:7 msgid "" "To implement a publish/subscribe behaviour to an object, whenever a " -"\"Subject\" object changes it's state, the attached \"Observers\" will be " +"\"Subject\" object changes its state, the attached \"Observers\" will be " "notified. It is used to shorten the amount of coupled objects and uses loose" " coupling instead." msgstr "" diff --git a/locale/pt_BR/LC_MESSAGES/Behavioral/Observer/README.po b/locale/pt_BR/LC_MESSAGES/Behavioral/Observer/README.po index 6aea8e9..5119740 100644 --- a/locale/pt_BR/LC_MESSAGES/Behavioral/Observer/README.po +++ b/locale/pt_BR/LC_MESSAGES/Behavioral/Observer/README.po @@ -1,4 +1,4 @@ -# +# msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" @@ -22,7 +22,7 @@ msgstr "" #: ../../Behavioral/Observer/README.rst:7 msgid "" "To implement a publish/subscribe behaviour to an object, whenever a " -"\"Subject\" object changes it's state, the attached \"Observers\" will be " +"\"Subject\" object changes its state, the attached \"Observers\" will be " "notified. It is used to shorten the amount of coupled objects and uses loose" " coupling instead." msgstr "" diff --git a/locale/ru/LC_MESSAGES/Behavioral/Observer/README.po b/locale/ru/LC_MESSAGES/Behavioral/Observer/README.po index fbd4f45..f21467d 100644 --- a/locale/ru/LC_MESSAGES/Behavioral/Observer/README.po +++ b/locale/ru/LC_MESSAGES/Behavioral/Observer/README.po @@ -22,7 +22,7 @@ msgstr "Назначение" #: ../../Behavioral/Observer/README.rst:7 msgid "" "To implement a publish/subscribe behaviour to an object, whenever a " -"\"Subject\" object changes it's state, the attached \"Observers\" will be " +"\"Subject\" object changes its state, the attached \"Observers\" will be " "notified. It is used to shorten the amount of coupled objects and uses loose" " coupling instead." msgstr "" diff --git a/locale/zh_CN/LC_MESSAGES/Behavioral/Observer/README.po b/locale/zh_CN/LC_MESSAGES/Behavioral/Observer/README.po index 6aea8e9..5119740 100644 --- a/locale/zh_CN/LC_MESSAGES/Behavioral/Observer/README.po +++ b/locale/zh_CN/LC_MESSAGES/Behavioral/Observer/README.po @@ -1,4 +1,4 @@ -# +# msgid "" msgstr "" "Project-Id-Version: DesignPatternsPHP 1.0\n" @@ -22,7 +22,7 @@ msgstr "" #: ../../Behavioral/Observer/README.rst:7 msgid "" "To implement a publish/subscribe behaviour to an object, whenever a " -"\"Subject\" object changes it's state, the attached \"Observers\" will be " +"\"Subject\" object changes its state, the attached \"Observers\" will be " "notified. It is used to shorten the amount of coupled objects and uses loose" " coupling instead." msgstr "" From 95ad95c33e9486f57e96d7f5fc81973b8499c325 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Wed, 21 Sep 2016 17:23:20 +0200 Subject: [PATCH 041/148] On to PHP7^! --- Behavioral/Observer/Tests/ObserverTest.php | 2 +- Makefile | 17 ++++++++++++ Structural/Decorator/Tests/DecoratorTest.php | 2 +- Structural/Proxy/Record.php | 28 ++++++++++---------- Structural/Proxy/RecordProxy.php | 28 +++++++++++--------- Structural/Proxy/Tests/ProxyTest.php | 25 +++++++++++++++++ 6 files changed, 74 insertions(+), 28 deletions(-) create mode 100644 Structural/Proxy/Tests/ProxyTest.php diff --git a/Behavioral/Observer/Tests/ObserverTest.php b/Behavioral/Observer/Tests/ObserverTest.php index d9dacec..6a3f369 100644 --- a/Behavioral/Observer/Tests/ObserverTest.php +++ b/Behavioral/Observer/Tests/ObserverTest.php @@ -57,7 +57,7 @@ class ObserverTest extends \PHPUnit_Framework_TestCase public function testUpdateCalling() { $subject = new User(); - $observer = $this->getMock('SplObserver'); + $observer = $this->createMock('SplObserver'); $subject->attach($observer); $observer->expects($this->once()) diff --git a/Makefile b/Makefile index 52169e6..c3841a2 100644 --- a/Makefile +++ b/Makefile @@ -190,3 +190,20 @@ pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." + +composer.phar: + php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" + php -r "if (hash_file('SHA384', 'composer-setup.php') === 'e115a8dc7871f15d853148a7fbac7da27d6c0030b848d9b3dc09e2a0388afed865e6a3d6b3c0fad45c48e2b5fc1196ae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" + php composer-setup.php + php -r "unlink('composer-setup.php');" + +install: vendor + +vendor: composer.phar + php composer.phar install + +cs: install + ./vendor/bin/phpcs -p --standard=PSR2 --ignore=vendor . + +test: install cs + ./vendor/bin/phpunit diff --git a/Structural/Decorator/Tests/DecoratorTest.php b/Structural/Decorator/Tests/DecoratorTest.php index 689caf2..2878772 100644 --- a/Structural/Decorator/Tests/DecoratorTest.php +++ b/Structural/Decorator/Tests/DecoratorTest.php @@ -73,7 +73,7 @@ class DecoratorTest extends \PHPUnit_Framework_TestCase */ public function testDecoratorOnlyAcceptRenderer() { - $mock = $this->getMock('DesignPatterns\Structural\Decorator\RendererInterface'); + $mock = $this->createMock('DesignPatterns\Structural\Decorator\RendererInterface'); $dec = $this->getMockForAbstractClass('DesignPatterns\Structural\Decorator\Decorator', array($mock)); $this->assertNotNull($dec); } diff --git a/Structural/Proxy/Record.php b/Structural/Proxy/Record.php index 7ae4a3c..fd9bb0c 100644 --- a/Structural/Proxy/Record.php +++ b/Structural/Proxy/Record.php @@ -8,44 +8,44 @@ namespace DesignPatterns\Structural\Proxy; class Record { /** - * @var array|null + * @var string[] */ - protected $data; + private $data; /** - * @param null $data + * @param string[] $data */ - public function __construct($data = null) + public function __construct(array $data = []) { - $this->data = (array) $data; + $this->data = $data; } /** - * magic setter. + * magic setter * * @param string $name * @param mixed $value * * @return void */ - public function __set($name, $value) + public function __set(string $name, string $value) { - $this->data[(string) $name] = $value; + $this->data[$name] = $value; } /** - * magic getter. + * magic getter * * @param string $name * - * @return mixed|null + * @return string|null */ - public function __get($name) + public function __get(string $name): string { - if (array_key_exists($name, $this->data)) { - return $this->data[(string) $name]; + if (isset($this->data[$name])) { + return $this->data[$name]; } else { - return; + return null; } } } diff --git a/Structural/Proxy/RecordProxy.php b/Structural/Proxy/RecordProxy.php index f8c78a8..2432e01 100644 --- a/Structural/Proxy/RecordProxy.php +++ b/Structural/Proxy/RecordProxy.php @@ -2,25 +2,22 @@ namespace DesignPatterns\Structural\Proxy; -/** - * Class RecordProxy. - */ class RecordProxy extends Record { /** * @var bool */ - protected $isDirty = false; + private $isDirty = false; /** * @var bool */ - protected $isInitialized = false; + private $isInitialized = false; /** * @param array $data */ - public function __construct($data) + public function __construct(array $data) { parent::__construct($data); @@ -28,23 +25,30 @@ class RecordProxy extends Record // since Record will hold our business logic, we don't want to // implement this behaviour there, but instead in a new proxy class // that extends the Record class - if (null !== $data) { + if (count($data) > 0) { $this->isInitialized = true; $this->isDirty = true; } } /** - * magic setter. + * magic setter * * @param string $name - * @param mixed $value - * - * @return void + * @param string $value */ - public function __set($name, $value) + public function __set(string $name, string $value) { $this->isDirty = true; + parent::__set($name, $value); } + + /** + * @return bool + */ + public function isDirty(): bool + { + return $this->isDirty; + } } diff --git a/Structural/Proxy/Tests/ProxyTest.php b/Structural/Proxy/Tests/ProxyTest.php new file mode 100644 index 0000000..955282f --- /dev/null +++ b/Structural/Proxy/Tests/ProxyTest.php @@ -0,0 +1,25 @@ +foobar = 'baz'; + + $this->assertTrue($recordProxy->isDirty()); + } + + public function testProxyIsInstanceOfRecord() + { + $recordProxy = new RecordProxy([]); + $recordProxy->foobar = 'baz'; + + $this->assertInstanceOf('DesignPatterns\Structural\Proxy\Record', $recordProxy); + } +} From 57c2e4f025b2ed35911c4a9fbb277b226e19cbae Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 08:47:57 +0200 Subject: [PATCH 042/148] #232 simplified things a bit --- Behavioral/Iterator/BookList.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Behavioral/Iterator/BookList.php b/Behavioral/Iterator/BookList.php index e69825f..f8d0c87 100644 --- a/Behavioral/Iterator/BookList.php +++ b/Behavioral/Iterator/BookList.php @@ -7,7 +7,7 @@ class BookList implements \Countable, \Iterator /** * @var Book[] */ - private $books; + private $books = []; /** * @var int @@ -22,11 +22,12 @@ class BookList implements \Countable, \Iterator public function removeBook(Book $bookToRemove) { foreach ($this->books as $key => $book) { - /** @var Book $book */ if ($book->getAuthorAndTitle() === $bookToRemove->getAuthorAndTitle()) { unset($this->books[$key]); } } + + $this->books = array_values($this->books); } public function count(): int @@ -36,12 +37,12 @@ class BookList implements \Countable, \Iterator public function current(): Book { - return $this->books[array_keys($this->books)[$this->currentIndex]]; + return $this->books[$this->currentIndex]; } public function key(): int { - return array_keys($this->books)[$this->currentIndex]; + return $this->currentIndex; } public function next() @@ -56,6 +57,6 @@ class BookList implements \Countable, \Iterator public function valid(): bool { - return isset(array_keys($this->books)[$this->currentIndex]); + return isset($this->books[$this->currentIndex]); } } From 1da5772226e3b9056fc9c92c471b8845e865518f Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 09:18:20 +0200 Subject: [PATCH 043/148] removed superfluous Class comments --- .../ChainOfResponsibilities/Responsible/FastStorage.php | 3 --- Behavioral/State/CreateOrder.php | 3 --- Behavioral/State/OrderController.php | 3 --- Behavioral/State/OrderFactory.php | 3 --- Behavioral/State/OrderInterface.php | 3 --- Behavioral/State/ShippingOrder.php | 3 --- Behavioral/Strategy/ComparatorInterface.php | 3 --- Behavioral/Strategy/DateComparator.php | 3 --- Behavioral/Strategy/IdComparator.php | 3 --- Behavioral/Strategy/ObjectCollection.php | 3 --- Creational/AbstractFactory/Html/Picture.php | 5 ----- Creational/AbstractFactory/Html/Text.php | 5 ----- Creational/AbstractFactory/HtmlFactory.php | 5 ----- Creational/AbstractFactory/Json/Picture.php | 5 ----- Creational/AbstractFactory/Json/Text.php | 5 ----- Creational/AbstractFactory/JsonFactory.php | 6 ------ Creational/AbstractFactory/Picture.php | 3 --- Creational/AbstractFactory/Text.php | 3 --- Creational/Builder/Parts/Door.php | 3 --- Creational/Builder/Parts/Engine.php | 3 --- Creational/Builder/Parts/Wheel.php | 3 --- Creational/Prototype/BarBookPrototype.php | 3 --- Creational/Prototype/FooBookPrototype.php | 3 --- Creational/StaticFactory/FormatNumber.php | 3 --- Creational/StaticFactory/FormatString.php | 3 --- Creational/StaticFactory/FormatterInterface.php | 3 --- More/Delegation/JuniorDeveloper.php | 3 --- More/Delegation/TeamLead.php | 3 --- More/EAV/Attribute.php | 3 --- More/EAV/Entity.php | 3 --- More/EAV/Value.php | 3 --- More/Repository/MemoryStorage.php | 3 --- More/Repository/Post.php | 5 ----- More/Repository/PostRepository.php | 5 +---- Structural/Composite/FormElement.php | 3 --- Structural/Composite/InputElement.php | 3 --- Structural/Composite/TextElement.php | 3 --- Structural/Decorator/RenderInJson.php | 3 --- Structural/Decorator/RenderInXml.php | 3 --- Structural/Decorator/RendererInterface.php | 3 --- Structural/Decorator/Webservice.php | 3 --- Structural/DependencyInjection/Connection.php | 3 --- Structural/Facade/Facade.php | 3 --- 43 files changed, 1 insertion(+), 145 deletions(-) diff --git a/Behavioral/ChainOfResponsibilities/Responsible/FastStorage.php b/Behavioral/ChainOfResponsibilities/Responsible/FastStorage.php index 8acaad1..d7cbe52 100644 --- a/Behavioral/ChainOfResponsibilities/Responsible/FastStorage.php +++ b/Behavioral/ChainOfResponsibilities/Responsible/FastStorage.php @@ -5,9 +5,6 @@ namespace DesignPatterns\Behavioral\ChainOfResponsibilities\Responsible; use DesignPatterns\Behavioral\ChainOfResponsibilities\Handler; use DesignPatterns\Behavioral\ChainOfResponsibilities\Request; -/** - * Class FastStorage. - */ class FastStorage extends Handler { /** diff --git a/Behavioral/State/CreateOrder.php b/Behavioral/State/CreateOrder.php index 7ac48d4..19c6b4a 100644 --- a/Behavioral/State/CreateOrder.php +++ b/Behavioral/State/CreateOrder.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\State; -/** - * Class CreateOrder. - */ class CreateOrder implements OrderInterface { /** diff --git a/Behavioral/State/OrderController.php b/Behavioral/State/OrderController.php index 93ac542..99ade5f 100644 --- a/Behavioral/State/OrderController.php +++ b/Behavioral/State/OrderController.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\State; -/** - * Class OrderController. - */ class OrderController { /** diff --git a/Behavioral/State/OrderFactory.php b/Behavioral/State/OrderFactory.php index 205d505..a2d3261 100644 --- a/Behavioral/State/OrderFactory.php +++ b/Behavioral/State/OrderFactory.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\State; -/** - * Class OrderFactory. - */ class OrderFactory { private function __construct() diff --git a/Behavioral/State/OrderInterface.php b/Behavioral/State/OrderInterface.php index 6a97e69..1f86b96 100644 --- a/Behavioral/State/OrderInterface.php +++ b/Behavioral/State/OrderInterface.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\State; -/** - * Class OrderInterface. - */ interface OrderInterface { /** diff --git a/Behavioral/State/ShippingOrder.php b/Behavioral/State/ShippingOrder.php index 943d714..0ffa068 100644 --- a/Behavioral/State/ShippingOrder.php +++ b/Behavioral/State/ShippingOrder.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\State; -/** - * Class ShippingOrder. - */ class ShippingOrder implements OrderInterface { /** diff --git a/Behavioral/Strategy/ComparatorInterface.php b/Behavioral/Strategy/ComparatorInterface.php index f472fd9..8e3c893 100644 --- a/Behavioral/Strategy/ComparatorInterface.php +++ b/Behavioral/Strategy/ComparatorInterface.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\Strategy; -/** - * Class ComparatorInterface. - */ interface ComparatorInterface { /** diff --git a/Behavioral/Strategy/DateComparator.php b/Behavioral/Strategy/DateComparator.php index d355dc9..37fc3ba 100644 --- a/Behavioral/Strategy/DateComparator.php +++ b/Behavioral/Strategy/DateComparator.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\Strategy; -/** - * Class DateComparator. - */ class DateComparator implements ComparatorInterface { /** diff --git a/Behavioral/Strategy/IdComparator.php b/Behavioral/Strategy/IdComparator.php index f829195..1f882a1 100644 --- a/Behavioral/Strategy/IdComparator.php +++ b/Behavioral/Strategy/IdComparator.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\Strategy; -/** - * Class IdComparator. - */ class IdComparator implements ComparatorInterface { /** diff --git a/Behavioral/Strategy/ObjectCollection.php b/Behavioral/Strategy/ObjectCollection.php index b5c1bd2..ed20969 100644 --- a/Behavioral/Strategy/ObjectCollection.php +++ b/Behavioral/Strategy/ObjectCollection.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\Strategy; -/** - * Class ObjectCollection. - */ class ObjectCollection { /** diff --git a/Creational/AbstractFactory/Html/Picture.php b/Creational/AbstractFactory/Html/Picture.php index 3abacb4..e5f430b 100644 --- a/Creational/AbstractFactory/Html/Picture.php +++ b/Creational/AbstractFactory/Html/Picture.php @@ -4,11 +4,6 @@ namespace DesignPatterns\Creational\AbstractFactory\Html; use DesignPatterns\Creational\AbstractFactory\Picture as BasePicture; -/** - * Class Picture. - * - * Picture is a concrete image for HTML rendering - */ class Picture extends BasePicture { /** diff --git a/Creational/AbstractFactory/Html/Text.php b/Creational/AbstractFactory/Html/Text.php index 8c33da6..32d9350 100644 --- a/Creational/AbstractFactory/Html/Text.php +++ b/Creational/AbstractFactory/Html/Text.php @@ -4,11 +4,6 @@ namespace DesignPatterns\Creational\AbstractFactory\Html; use DesignPatterns\Creational\AbstractFactory\Text as BaseText; -/** - * Class Text. - * - * Text is a concrete text for HTML rendering - */ class Text extends BaseText { /** diff --git a/Creational/AbstractFactory/HtmlFactory.php b/Creational/AbstractFactory/HtmlFactory.php index 5c22859..1d622e1 100644 --- a/Creational/AbstractFactory/HtmlFactory.php +++ b/Creational/AbstractFactory/HtmlFactory.php @@ -2,11 +2,6 @@ namespace DesignPatterns\Creational\AbstractFactory; -/** - * Class HtmlFactory. - * - * HtmlFactory is a concrete factory for HTML component - */ class HtmlFactory extends AbstractFactory { /** diff --git a/Creational/AbstractFactory/Json/Picture.php b/Creational/AbstractFactory/Json/Picture.php index 77bb150..cee82dd 100644 --- a/Creational/AbstractFactory/Json/Picture.php +++ b/Creational/AbstractFactory/Json/Picture.php @@ -4,11 +4,6 @@ namespace DesignPatterns\Creational\AbstractFactory\Json; use DesignPatterns\Creational\AbstractFactory\Picture as BasePicture; -/** - * Class Picture. - * - * Picture is a concrete image for JSON rendering - */ class Picture extends BasePicture { /** diff --git a/Creational/AbstractFactory/Json/Text.php b/Creational/AbstractFactory/Json/Text.php index 4c51785..df69a4d 100644 --- a/Creational/AbstractFactory/Json/Text.php +++ b/Creational/AbstractFactory/Json/Text.php @@ -4,11 +4,6 @@ namespace DesignPatterns\Creational\AbstractFactory\Json; use DesignPatterns\Creational\AbstractFactory\Text as BaseText; -/** - * Class Text. - * - * Text is a text component with a JSON rendering - */ class Text extends BaseText { /** diff --git a/Creational/AbstractFactory/JsonFactory.php b/Creational/AbstractFactory/JsonFactory.php index 63a9979..945f55d 100644 --- a/Creational/AbstractFactory/JsonFactory.php +++ b/Creational/AbstractFactory/JsonFactory.php @@ -2,12 +2,6 @@ namespace DesignPatterns\Creational\AbstractFactory; -/** - * Class JsonFactory. - * - * JsonFactory is a factory for creating a family of JSON component - * (example for ajax) - */ class JsonFactory extends AbstractFactory { /** diff --git a/Creational/AbstractFactory/Picture.php b/Creational/AbstractFactory/Picture.php index 89fd66f..e0b4172 100644 --- a/Creational/AbstractFactory/Picture.php +++ b/Creational/AbstractFactory/Picture.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\AbstractFactory; -/** - * Class Picture. - */ abstract class Picture implements MediaInterface { /** diff --git a/Creational/AbstractFactory/Text.php b/Creational/AbstractFactory/Text.php index 30984f3..593c4e5 100644 --- a/Creational/AbstractFactory/Text.php +++ b/Creational/AbstractFactory/Text.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\AbstractFactory; -/** - * Class Text. - */ abstract class Text implements MediaInterface { /** diff --git a/Creational/Builder/Parts/Door.php b/Creational/Builder/Parts/Door.php index fc12608..f2732fe 100644 --- a/Creational/Builder/Parts/Door.php +++ b/Creational/Builder/Parts/Door.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\Builder\Parts; -/** - * Class Door. - */ class Door { } diff --git a/Creational/Builder/Parts/Engine.php b/Creational/Builder/Parts/Engine.php index 5232ab3..48046b8 100644 --- a/Creational/Builder/Parts/Engine.php +++ b/Creational/Builder/Parts/Engine.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\Builder\Parts; -/** - * Class Engine. - */ class Engine { } diff --git a/Creational/Builder/Parts/Wheel.php b/Creational/Builder/Parts/Wheel.php index 0a1afbd..4e677e3 100644 --- a/Creational/Builder/Parts/Wheel.php +++ b/Creational/Builder/Parts/Wheel.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\Builder\Parts; -/** - * Class Wheel. - */ class Wheel { } diff --git a/Creational/Prototype/BarBookPrototype.php b/Creational/Prototype/BarBookPrototype.php index 7c9b72b..c323a8c 100644 --- a/Creational/Prototype/BarBookPrototype.php +++ b/Creational/Prototype/BarBookPrototype.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\Prototype; -/** - * Class BarBookPrototype. - */ class BarBookPrototype extends BookPrototype { /** diff --git a/Creational/Prototype/FooBookPrototype.php b/Creational/Prototype/FooBookPrototype.php index 95ea9e6..47c73e6 100644 --- a/Creational/Prototype/FooBookPrototype.php +++ b/Creational/Prototype/FooBookPrototype.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\Prototype; -/** - * Class FooBookPrototype. - */ class FooBookPrototype extends BookPrototype { protected $category = 'Foo'; diff --git a/Creational/StaticFactory/FormatNumber.php b/Creational/StaticFactory/FormatNumber.php index e577ab2..69fd9e1 100644 --- a/Creational/StaticFactory/FormatNumber.php +++ b/Creational/StaticFactory/FormatNumber.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\StaticFactory; -/** - * Class FormatNumber. - */ class FormatNumber implements FormatterInterface { } diff --git a/Creational/StaticFactory/FormatString.php b/Creational/StaticFactory/FormatString.php index 5cb9e28..14c2055 100644 --- a/Creational/StaticFactory/FormatString.php +++ b/Creational/StaticFactory/FormatString.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\StaticFactory; -/** - * Class FormatString. - */ class FormatString implements FormatterInterface { } diff --git a/Creational/StaticFactory/FormatterInterface.php b/Creational/StaticFactory/FormatterInterface.php index 349f8b6..22ea0de 100644 --- a/Creational/StaticFactory/FormatterInterface.php +++ b/Creational/StaticFactory/FormatterInterface.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\StaticFactory; -/** - * Class FormatterInterface. - */ interface FormatterInterface { } diff --git a/More/Delegation/JuniorDeveloper.php b/More/Delegation/JuniorDeveloper.php index 0946dad..64e2ff6 100644 --- a/More/Delegation/JuniorDeveloper.php +++ b/More/Delegation/JuniorDeveloper.php @@ -2,9 +2,6 @@ namespace DesignPatterns\More\Delegation; -/** - * Class JuniorDeveloper. - */ class JuniorDeveloper { public function writeBadCode() diff --git a/More/Delegation/TeamLead.php b/More/Delegation/TeamLead.php index 9b75190..b617d54 100644 --- a/More/Delegation/TeamLead.php +++ b/More/Delegation/TeamLead.php @@ -2,9 +2,6 @@ namespace DesignPatterns\More\Delegation; -/** - * Class TeamLead. - */ class TeamLead { /** @var JuniorDeveloper */ diff --git a/More/EAV/Attribute.php b/More/EAV/Attribute.php index 3874360..dda66e9 100644 --- a/More/EAV/Attribute.php +++ b/More/EAV/Attribute.php @@ -4,9 +4,6 @@ namespace DesignPatterns\More\EAV; use SplObjectStorage; -/** - * Class Attribute. - */ class Attribute implements ValueAccessInterface { /** diff --git a/More/EAV/Entity.php b/More/EAV/Entity.php index ff26589..e98f11a 100644 --- a/More/EAV/Entity.php +++ b/More/EAV/Entity.php @@ -4,9 +4,6 @@ namespace DesignPatterns\More\EAV; use SplObjectStorage; -/** - * Class Entity. - */ class Entity implements ValueAccessInterface { /** diff --git a/More/EAV/Value.php b/More/EAV/Value.php index da4370f..e3556c6 100644 --- a/More/EAV/Value.php +++ b/More/EAV/Value.php @@ -2,9 +2,6 @@ namespace DesignPatterns\More\EAV; -/** - * Class Value. - */ class Value implements ValueInterface { /** diff --git a/More/Repository/MemoryStorage.php b/More/Repository/MemoryStorage.php index 44276d5..d970773 100644 --- a/More/Repository/MemoryStorage.php +++ b/More/Repository/MemoryStorage.php @@ -2,9 +2,6 @@ namespace DesignPatterns\More\Repository; -/** - * Class MemoryStorage. - */ class MemoryStorage implements Storage { private $data; diff --git a/More/Repository/Post.php b/More/Repository/Post.php index e9990b4..6fdcfc0 100644 --- a/More/Repository/Post.php +++ b/More/Repository/Post.php @@ -2,11 +2,6 @@ namespace DesignPatterns\More\Repository; -/** - * Post represents entity for some post that user left on the site. - * - * Class Post - */ class Post { /** diff --git a/More/Repository/PostRepository.php b/More/Repository/PostRepository.php index e7687f3..2f92dd3 100644 --- a/More/Repository/PostRepository.php +++ b/More/Repository/PostRepository.php @@ -3,16 +3,13 @@ namespace DesignPatterns\More\Repository; /** - * Repository for class Post - * This class is between Entity layer(class Post) and access object layer(interface Storage). + * This class is between Entity layer (class Post) and access object layer (interface Storage). * * Repository encapsulates the set of objects persisted in a data store and the operations performed over them * providing a more object-oriented view of the persistence layer * * Repository also supports the objective of achieving a clean separation and one-way dependency * between the domain and data mapping layers - * - * Class PostRepository */ class PostRepository { diff --git a/Structural/Composite/FormElement.php b/Structural/Composite/FormElement.php index 0055aee..76ecf31 100644 --- a/Structural/Composite/FormElement.php +++ b/Structural/Composite/FormElement.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Composite; -/** - * Class FormElement. - */ abstract class FormElement { /** diff --git a/Structural/Composite/InputElement.php b/Structural/Composite/InputElement.php index 19786d5..44ac047 100644 --- a/Structural/Composite/InputElement.php +++ b/Structural/Composite/InputElement.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Composite; -/** - * Class InputElement. - */ class InputElement extends FormElement { /** diff --git a/Structural/Composite/TextElement.php b/Structural/Composite/TextElement.php index 48b33ba..8bd56b5 100644 --- a/Structural/Composite/TextElement.php +++ b/Structural/Composite/TextElement.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Composite; -/** - * Class TextElement. - */ class TextElement extends FormElement { /** diff --git a/Structural/Decorator/RenderInJson.php b/Structural/Decorator/RenderInJson.php index fb9a71e..e950e28 100644 --- a/Structural/Decorator/RenderInJson.php +++ b/Structural/Decorator/RenderInJson.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Decorator; -/** - * Class RenderInJson. - */ class RenderInJson extends Decorator { /** diff --git a/Structural/Decorator/RenderInXml.php b/Structural/Decorator/RenderInXml.php index f203d53..5afffda 100644 --- a/Structural/Decorator/RenderInXml.php +++ b/Structural/Decorator/RenderInXml.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Decorator; -/** - * Class RenderInXml. - */ class RenderInXml extends Decorator { /** diff --git a/Structural/Decorator/RendererInterface.php b/Structural/Decorator/RendererInterface.php index 73152b9..e7b95eb 100644 --- a/Structural/Decorator/RendererInterface.php +++ b/Structural/Decorator/RendererInterface.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Decorator; -/** - * Class RendererInterface. - */ interface RendererInterface { /** diff --git a/Structural/Decorator/Webservice.php b/Structural/Decorator/Webservice.php index e2bcc69..1151672 100644 --- a/Structural/Decorator/Webservice.php +++ b/Structural/Decorator/Webservice.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Decorator; -/** - * Class Webservice. - */ class Webservice implements RendererInterface { /** diff --git a/Structural/DependencyInjection/Connection.php b/Structural/DependencyInjection/Connection.php index d389089..1a5764c 100644 --- a/Structural/DependencyInjection/Connection.php +++ b/Structural/DependencyInjection/Connection.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\DependencyInjection; -/** - * Class Connection. - */ class Connection { /** diff --git a/Structural/Facade/Facade.php b/Structural/Facade/Facade.php index 43d1bcb..f199600 100644 --- a/Structural/Facade/Facade.php +++ b/Structural/Facade/Facade.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Facade; -/** - * Class Facade. - */ class Facade { /** From a6b09d6b18edcca1bde40c8102b3b3ac0b878e2a Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 09:25:26 +0200 Subject: [PATCH 044/148] PHP7 Command --- Behavioral/Command/AddMessageDateCommand.php | 4 +- Behavioral/Command/CommandInterface.php | 3 -- Behavioral/Command/HelloCommand.php | 9 ++-- Behavioral/Command/Invoker.php | 10 ++--- Behavioral/Command/Receiver.php | 18 +++++--- Behavioral/Command/Tests/CommandTest.php | 28 +++---------- .../Command/Tests/UndoableCommandTest.php | 41 ++++++------------- .../Command/UndoableCommandInterface.php | 4 -- 8 files changed, 40 insertions(+), 77 deletions(-) diff --git a/Behavioral/Command/AddMessageDateCommand.php b/Behavioral/Command/AddMessageDateCommand.php index 11bb9af..fcaeb4f 100644 --- a/Behavioral/Command/AddMessageDateCommand.php +++ b/Behavioral/Command/AddMessageDateCommand.php @@ -4,14 +4,14 @@ namespace DesignPatterns\Behavioral\Command; /** * This concrete command tweaks receiver to add current date to messages - * invoker just knows that it can call "execute". + * invoker just knows that it can call "execute" */ class AddMessageDateCommand implements UndoableCommandInterface { /** * @var Receiver */ - protected $output; + private $output; /** * Each concrete command is built with different receivers. diff --git a/Behavioral/Command/CommandInterface.php b/Behavioral/Command/CommandInterface.php index cd9d9c6..265e862 100644 --- a/Behavioral/Command/CommandInterface.php +++ b/Behavioral/Command/CommandInterface.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\Command; -/** - * class CommandInterface. - */ interface CommandInterface { /** diff --git a/Behavioral/Command/HelloCommand.php b/Behavioral/Command/HelloCommand.php index 94d4723..1dbfaf5 100644 --- a/Behavioral/Command/HelloCommand.php +++ b/Behavioral/Command/HelloCommand.php @@ -4,18 +4,18 @@ namespace DesignPatterns\Behavioral\Command; /** * This concrete command calls "print" on the Receiver, but an external - * invoker just knows that it can call "execute". + * invoker just knows that it can call "execute" */ class HelloCommand implements CommandInterface { /** * @var Receiver */ - protected $output; + private $output; /** * Each concrete command is built with different receivers. - * There can be one, many or completely no receivers, but there can be other commands in the parameters. + * There can be one, many or completely no receivers, but there can be other commands in the parameters * * @param Receiver $console */ @@ -29,8 +29,7 @@ class HelloCommand implements CommandInterface */ public function execute() { - // sometimes, there is no receiver and this is the command which - // does all the work + // sometimes, there is no receiver and this is the command which does all the work $this->output->write('Hello World'); } } diff --git a/Behavioral/Command/Invoker.php b/Behavioral/Command/Invoker.php index 7942adb..c6e7f93 100644 --- a/Behavioral/Command/Invoker.php +++ b/Behavioral/Command/Invoker.php @@ -11,11 +11,11 @@ class Invoker /** * @var CommandInterface */ - protected $command; + private $command; /** - * In the invoker we find this kind of method for subscribing the command. - * There can be also a stack, a list, a fixed set... + * in the invoker we find this kind of method for subscribing the command + * There can be also a stack, a list, a fixed set ... * * @param CommandInterface $cmd */ @@ -25,12 +25,10 @@ class Invoker } /** - * executes the command. + * executes the command; the invoker is the same whatever is the command */ public function run() { - // here is a key feature of the invoker - // the invoker is the same whatever is the command $this->command->execute(); } } diff --git a/Behavioral/Command/Receiver.php b/Behavioral/Command/Receiver.php index 956ce74..7ca6343 100644 --- a/Behavioral/Command/Receiver.php +++ b/Behavioral/Command/Receiver.php @@ -7,14 +7,20 @@ namespace DesignPatterns\Behavioral\Command; */ class Receiver { + /** + * @var bool + */ private $enableDate = false; - private $output = array(); + /** + * @var string[] + */ + private $output = []; /** * @param string $str */ - public function write($str) + public function write(string $str) { if ($this->enableDate) { $str .= ' ['.date('Y-m-d').']'; @@ -23,13 +29,13 @@ class Receiver $this->output[] = $str; } - public function getOutput() + public function getOutput(): string { - return implode("\n", $this->output); + return join("\n", $this->output); } /** - * Enable receiver to display message date. + * Enable receiver to display message date */ public function enableDate() { @@ -37,7 +43,7 @@ class Receiver } /** - * Disable receiver to display message date. + * Disable receiver to display message date */ public function disableDate() { diff --git a/Behavioral/Command/Tests/CommandTest.php b/Behavioral/Command/Tests/CommandTest.php index 3852495..cd3ea03 100644 --- a/Behavioral/Command/Tests/CommandTest.php +++ b/Behavioral/Command/Tests/CommandTest.php @@ -6,31 +6,15 @@ use DesignPatterns\Behavioral\Command\HelloCommand; use DesignPatterns\Behavioral\Command\Invoker; use DesignPatterns\Behavioral\Command\Receiver; -/** - * CommandTest has the role of the Client in the Command Pattern. - */ class CommandTest extends \PHPUnit_Framework_TestCase { - /** - * @var Invoker - */ - protected $invoker; - - /** - * @var Receiver - */ - protected $receiver; - - protected function setUp() - { - $this->invoker = new Invoker(); - $this->receiver = new Receiver(); - } - public function testInvocation() { - $this->invoker->setCommand(new HelloCommand($this->receiver)); - $this->invoker->run(); - $this->assertEquals($this->receiver->getOutput(), 'Hello World'); + $invoker = new Invoker(); + $receiver = new Receiver(); + + $invoker->setCommand(new HelloCommand($receiver)); + $invoker->run(); + $this->assertEquals($receiver->getOutput(), 'Hello World'); } } diff --git a/Behavioral/Command/Tests/UndoableCommandTest.php b/Behavioral/Command/Tests/UndoableCommandTest.php index 5302a7b..8d10259 100644 --- a/Behavioral/Command/Tests/UndoableCommandTest.php +++ b/Behavioral/Command/Tests/UndoableCommandTest.php @@ -6,44 +6,27 @@ use DesignPatterns\Behavioral\Command\AddMessageDateCommand; use DesignPatterns\Behavioral\Command\HelloCommand; use DesignPatterns\Behavioral\Command\Invoker; use DesignPatterns\Behavioral\Command\Receiver; -use PHPUnit_Framework_TestCase; -/** - * UndoableCommandTest has the role of the Client in the Command Pattern. - */ -class UndoableCommandTest extends PHPUnit_Framework_TestCase +class UndoableCommandTest extends \PHPUnit_Framework_TestCase { - /** - * @var Invoker - */ - protected $invoker; - - /** - * @var Receiver - */ - protected $receiver; - - protected function setUp() - { - $this->invoker = new Invoker(); - $this->receiver = new Receiver(); - } - public function testInvocation() { - $this->invoker->setCommand(new HelloCommand($this->receiver)); - $this->invoker->run(); - $this->assertEquals($this->receiver->getOutput(), 'Hello World'); + $invoker = new Invoker(); + $receiver = new Receiver(); - $messageDateCommand = new AddMessageDateCommand($this->receiver); + $invoker->setCommand(new HelloCommand($receiver)); + $invoker->run(); + $this->assertEquals($receiver->getOutput(), 'Hello World'); + + $messageDateCommand = new AddMessageDateCommand($receiver); $messageDateCommand->execute(); - $this->invoker->run(); - $this->assertEquals($this->receiver->getOutput(), "Hello World\nHello World [".date('Y-m-d').']'); + $invoker->run(); + $this->assertEquals($receiver->getOutput(), "Hello World\nHello World [".date('Y-m-d').']'); $messageDateCommand->undo(); - $this->invoker->run(); - $this->assertEquals($this->receiver->getOutput(), "Hello World\nHello World [".date('Y-m-d')."]\nHello World"); + $invoker->run(); + $this->assertEquals($receiver->getOutput(), "Hello World\nHello World [".date('Y-m-d')."]\nHello World"); } } diff --git a/Behavioral/Command/UndoableCommandInterface.php b/Behavioral/Command/UndoableCommandInterface.php index f9234ab..52b02e9 100644 --- a/Behavioral/Command/UndoableCommandInterface.php +++ b/Behavioral/Command/UndoableCommandInterface.php @@ -2,14 +2,10 @@ namespace DesignPatterns\Behavioral\Command; -/** - * Interface UndoableCommandInterface. - */ interface UndoableCommandInterface extends CommandInterface { /** * This method is used to undo change made by command execution - * The Receiver goes in the constructor. */ public function undo(); } From 64e21e8581430124589745c442d3b30945e67216 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 09:38:55 +0200 Subject: [PATCH 045/148] PHP7 Mediator --- Behavioral/Mediator/Colleague.php | 18 +++------- Behavioral/Mediator/Mediator.php | 41 ++++++++++------------ Behavioral/Mediator/MediatorInterface.php | 6 ++-- Behavioral/Mediator/Subsystem/Client.php | 14 ++------ Behavioral/Mediator/Subsystem/Database.php | 8 +---- Behavioral/Mediator/Subsystem/Server.php | 10 ++---- Behavioral/Mediator/Tests/MediatorTest.php | 21 +++-------- 7 files changed, 36 insertions(+), 82 deletions(-) diff --git a/Behavioral/Mediator/Colleague.php b/Behavioral/Mediator/Colleague.php index c74dee5..3a83742 100644 --- a/Behavioral/Mediator/Colleague.php +++ b/Behavioral/Mediator/Colleague.php @@ -4,7 +4,7 @@ namespace DesignPatterns\Behavioral\Mediator; /** * Colleague is an abstract colleague who works together but he only knows - * the Mediator, not other colleague. + * the Mediator, not other colleagues */ abstract class Colleague { @@ -13,21 +13,13 @@ abstract class Colleague * * @var MediatorInterface */ - private $mediator; + protected $mediator; /** - * @param MediatorInterface $medium + * @param MediatorInterface $mediator */ - public function __construct(MediatorInterface $medium) + public function setMediator(MediatorInterface $mediator) { - // in this way, we are sure the concrete colleague knows the mediator - $this->mediator = $medium; - } - - // for subclasses - - protected function getMediator() - { - return $this->mediator; + $this->mediator = $mediator; } } diff --git a/Behavioral/Mediator/Mediator.php b/Behavioral/Mediator/Mediator.php index 98a7890..08e1b71 100644 --- a/Behavioral/Mediator/Mediator.php +++ b/Behavioral/Mediator/Mediator.php @@ -3,59 +3,54 @@ namespace DesignPatterns\Behavioral\Mediator; /** - * Mediator is the concrete Mediator for this design pattern. - * In this example, I have made a "Hello World" with the Mediator Pattern. + * Mediator is the concrete Mediator for this design pattern + * + * In this example, I have made a "Hello World" with the Mediator Pattern */ class Mediator implements MediatorInterface { /** * @var Subsystem\Server */ - protected $server; + private $server; /** * @var Subsystem\Database */ - protected $database; + private $database; /** * @var Subsystem\Client */ - protected $client; + private $client; /** - * @param Subsystem\Database $db - * @param Subsystem\Client $cl - * @param Subsystem\Server $srv + * @param Subsystem\Database $database + * @param Subsystem\Client $client + * @param Subsystem\Server $server */ - public function setColleague(Subsystem\Database $db, Subsystem\Client $cl, Subsystem\Server $srv) + public function __construct(Subsystem\Database $database, Subsystem\Client $client, Subsystem\Server $server) { - $this->database = $db; - $this->server = $srv; - $this->client = $cl; + $this->database = $database; + $this->server = $server; + $this->client = $client; + + $this->database->setMediator($this); + $this->server->setMediator($this); + $this->client->setMediator($this); } - /** - * make request. - */ public function makeRequest() { $this->server->process(); } - /** - * query db. - * - * @return mixed - */ - public function queryDb() + public function queryDb(): string { return $this->database->getData(); } /** - * send response. - * * @param string $content */ public function sendResponse($content) diff --git a/Behavioral/Mediator/MediatorInterface.php b/Behavioral/Mediator/MediatorInterface.php index dbdd489..5ec717a 100644 --- a/Behavioral/Mediator/MediatorInterface.php +++ b/Behavioral/Mediator/MediatorInterface.php @@ -4,7 +4,7 @@ namespace DesignPatterns\Behavioral\Mediator; /** * MediatorInterface is a contract for the Mediator - * This interface is not mandatory but it is better for LSP concerns. + * This interface is not mandatory but it is better for Liskov substitution principle concerns. */ interface MediatorInterface { @@ -16,12 +16,12 @@ interface MediatorInterface public function sendResponse($content); /** - * makes a request. + * makes a request */ public function makeRequest(); /** - * queries the DB. + * queries the DB */ public function queryDb(); } diff --git a/Behavioral/Mediator/Subsystem/Client.php b/Behavioral/Mediator/Subsystem/Client.php index f7a21c9..e7897a4 100644 --- a/Behavioral/Mediator/Subsystem/Client.php +++ b/Behavioral/Mediator/Subsystem/Client.php @@ -5,24 +5,16 @@ namespace DesignPatterns\Behavioral\Mediator\Subsystem; use DesignPatterns\Behavioral\Mediator\Colleague; /** - * Client is a client that make request et get response. + * Client is a client that makes requests and gets the response response. */ class Client extends Colleague { - /** - * request. - */ public function request() { - $this->getMediator()->makeRequest(); + $this->mediator->makeRequest(); } - /** - * output content. - * - * @param string $content - */ - public function output($content) + public function output(string $content) { echo $content; } diff --git a/Behavioral/Mediator/Subsystem/Database.php b/Behavioral/Mediator/Subsystem/Database.php index 69ad6cf..9255f22 100644 --- a/Behavioral/Mediator/Subsystem/Database.php +++ b/Behavioral/Mediator/Subsystem/Database.php @@ -4,15 +4,9 @@ namespace DesignPatterns\Behavioral\Mediator\Subsystem; use DesignPatterns\Behavioral\Mediator\Colleague; -/** - * Database is a database service. - */ class Database extends Colleague { - /** - * @return string - */ - public function getData() + public function getData(): string { return 'World'; } diff --git a/Behavioral/Mediator/Subsystem/Server.php b/Behavioral/Mediator/Subsystem/Server.php index 1602bcb..c05be5e 100644 --- a/Behavioral/Mediator/Subsystem/Server.php +++ b/Behavioral/Mediator/Subsystem/Server.php @@ -4,17 +4,11 @@ namespace DesignPatterns\Behavioral\Mediator\Subsystem; use DesignPatterns\Behavioral\Mediator\Colleague; -/** - * Server serves responses. - */ class Server extends Colleague { - /** - * process on server. - */ public function process() { - $data = $this->getMediator()->queryDb(); - $this->getMediator()->sendResponse("Hello $data"); + $data = $this->mediator->queryDb(); + $this->mediator->sendResponse(sprintf("Hello %s", $data)); } } diff --git a/Behavioral/Mediator/Tests/MediatorTest.php b/Behavioral/Mediator/Tests/MediatorTest.php index 2bce947..2cd40a6 100644 --- a/Behavioral/Mediator/Tests/MediatorTest.php +++ b/Behavioral/Mediator/Tests/MediatorTest.php @@ -7,27 +7,14 @@ use DesignPatterns\Behavioral\Mediator\Subsystem\Client; use DesignPatterns\Behavioral\Mediator\Subsystem\Database; use DesignPatterns\Behavioral\Mediator\Subsystem\Server; -/** - * MediatorTest tests hello world. - */ class MediatorTest extends \PHPUnit_Framework_TestCase { - protected $client; - - protected function setUp() - { - $media = new Mediator(); - $this->client = new Client($media); - $media->setColleague(new Database($media), $this->client, new Server($media)); - } - public function testOutputHelloWorld() { - // testing if Hello World is output : + $client = new Client(); + new Mediator(new Database(), $client, new Server()); + $this->expectOutputString('Hello World'); - // as you see, the 3 components Client, Server and Database are totally decoupled - $this->client->request(); - // Anyway, it remains complexity in the Mediator that's why the pattern - // Observer is preferable in mnay situations. + $client->request(); } } From 01007ec5a8c440af8543607dac14e6db20a16a1f Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 10:39:03 +0200 Subject: [PATCH 046/148] PHP7 Memento --- Behavioral/Memento/Caretaker.php | 49 - Behavioral/Memento/Memento.php | 10 +- Behavioral/Memento/Originator.php | 38 - Behavioral/Memento/README.rst | 8 +- Behavioral/Memento/State.php | 48 + Behavioral/Memento/Tests/MementoTest.php | 163 +-- Behavioral/Memento/Ticket.php | 49 + Behavioral/Memento/uml/Memento.uml | 21 + Behavioral/Memento/uml/Momento.uml | 22 - Behavioral/Memento/uml/uml.png | Bin 62525 -> 63348 bytes Behavioral/Memento/uml/uml.svg | 1262 ++++++++++++++++------ 11 files changed, 1096 insertions(+), 574 deletions(-) delete mode 100644 Behavioral/Memento/Caretaker.php delete mode 100644 Behavioral/Memento/Originator.php create mode 100644 Behavioral/Memento/State.php create mode 100644 Behavioral/Memento/Ticket.php create mode 100644 Behavioral/Memento/uml/Memento.uml delete mode 100644 Behavioral/Memento/uml/Momento.uml diff --git a/Behavioral/Memento/Caretaker.php b/Behavioral/Memento/Caretaker.php deleted file mode 100644 index d80454a..0000000 --- a/Behavioral/Memento/Caretaker.php +++ /dev/null @@ -1,49 +0,0 @@ -history[$id]; - } - - /** - * @param Memento $state - */ - public function saveToHistory(Memento $state) - { - $this->history[] = $state; - } - - public function runCustomLogic() - { - $originator = new Originator(); - - //Setting state to State1 - $originator->setState('State1'); - //Setting state to State2 - $originator->setState('State2'); - //Saving State2 to Memento - $this->saveToHistory($originator->getStateAsMemento()); - //Setting state to State3 - $originator->setState('State3'); - - // We can request multiple mementos, and choose which one to roll back to. - // Saving State3 to Memento - $this->saveToHistory($originator->getStateAsMemento()); - //Setting state to State4 - $originator->setState('State4'); - - $originator->restoreFromMemento($this->getFromHistory(1)); - //State after restoring from Memento: State3 - - return $originator->getStateAsMemento()->getState(); - } -} diff --git a/Behavioral/Memento/Memento.php b/Behavioral/Memento/Memento.php index 4dd2fc8..f75fcc9 100644 --- a/Behavioral/Memento/Memento.php +++ b/Behavioral/Memento/Memento.php @@ -4,19 +4,21 @@ namespace DesignPatterns\Behavioral\Memento; class Memento { - /* @var mixed */ + /** + * @var State + */ private $state; /** - * @param mixed $stateToSave + * @param State $stateToSave */ - public function __construct($stateToSave) + public function __construct(State $stateToSave) { $this->state = $stateToSave; } /** - * @return mixed + * @return State */ public function getState() { diff --git a/Behavioral/Memento/Originator.php b/Behavioral/Memento/Originator.php deleted file mode 100644 index 3acb0c1..0000000 --- a/Behavioral/Memento/Originator.php +++ /dev/null @@ -1,38 +0,0 @@ -state = $state; - } - - /** - * @return Memento - */ - public function getStateAsMemento() - { - // you must save a separate copy in Memento - $state = is_object($this->state) ? clone $this->state : $this->state; - - return new Memento($state); - } - - public function restoreFromMemento(Memento $memento) - { - $this->state = $memento->getState(); - } -} diff --git a/Behavioral/Memento/README.rst b/Behavioral/Memento/README.rst index 911e30e..32ec703 100644 --- a/Behavioral/Memento/README.rst +++ b/Behavioral/Memento/README.rst @@ -6,8 +6,8 @@ Purpose It provides the ability to restore an object to it's previous state (undo via rollback) or to gain access to state of the object, without revealing -it's implementation (i.e., the object is not required to have a functional -for return the current state). +it's implementation (i.e., the object is not required to have a function +to return the current state). The memento pattern is implemented with three objects: the Originator, a Caretaker and a Memento. @@ -66,9 +66,9 @@ Originator.php :language: php :linenos: -Caretaker.php +Ticket.php -.. literalinclude:: Caretaker.php +.. literalinclude:: Ticket.php :language: php :linenos: diff --git a/Behavioral/Memento/State.php b/Behavioral/Memento/State.php new file mode 100644 index 0000000..6cb5dd1 --- /dev/null +++ b/Behavioral/Memento/State.php @@ -0,0 +1,48 @@ +state = $state; + } + + private static function ensureIsValidState(string $state) + { + if (!in_array($state, self::$validStates)) { + throw new \InvalidArgumentException('Invalid state given'); + } + } + + public function __toString(): string + { + return $this->state; + } +} diff --git a/Behavioral/Memento/Tests/MementoTest.php b/Behavioral/Memento/Tests/MementoTest.php index 722dbfa..d4a44f3 100644 --- a/Behavioral/Memento/Tests/MementoTest.php +++ b/Behavioral/Memento/Tests/MementoTest.php @@ -2,161 +2,30 @@ namespace DesignPatterns\Behavioral\Memento\Tests; -use DesignPatterns\Behavioral\Memento\Caretaker; -use DesignPatterns\Behavioral\Memento\Memento; -use DesignPatterns\Behavioral\Memento\Originator; +use DesignPatterns\Behavioral\Memento\State; +use DesignPatterns\Behavioral\Memento\Ticket; -/** - * MementoTest tests the memento pattern. - */ class MementoTest extends \PHPUnit_Framework_TestCase { - public function testUsageExample() + public function testOpenTicketAssignAndSetBackToOpen() { - $originator = new Originator(); - $caretaker = new Caretaker(); + $ticket = new Ticket(); - $character = new \stdClass(); - // new object - $character->name = 'Gandalf'; - // connect Originator to character object - $originator->setState($character); + // open the ticket + $ticket->open(); + $openedState = $ticket->getState(); + $this->assertEquals(State::STATE_OPENED, (string) $ticket->getState()); - // work on the object - $character->name = 'Gandalf the Grey'; - // still change something - $character->race = 'Maia'; - // time to save state - $snapshot = $originator->getStateAsMemento(); - // put state to log - $caretaker->saveToHistory($snapshot); + $memento = $ticket->saveToMemento(); - // change something - $character->name = 'Sauron'; - // and again - $character->race = 'Ainur'; - // state inside the Originator was equally changed - $this->assertAttributeEquals($character, 'state', $originator); + // assign the ticket + $ticket->assign(); + $this->assertEquals(State::STATE_ASSIGNED, (string) $ticket->getState()); - // time to save another state - $snapshot = $originator->getStateAsMemento(); - // put state to log - $caretaker->saveToHistory($snapshot); + // no restore to the opened state, but verify that the state object has been cloned for the memento + $ticket->restoreFromMemento($memento); - $rollback = $caretaker->getFromHistory(0); - // return to first state - $originator->restoreFromMemento($rollback); - // use character from old state - $character = $rollback->getState(); - - // yes, that what we need - $this->assertEquals('Gandalf the Grey', $character->name); - // make new changes - $character->name = 'Gandalf the White'; - - // and Originator linked to actual object again - $this->assertAttributeEquals($character, 'state', $originator); - } - - public function testStringState() - { - $originator = new Originator(); - $originator->setState('State1'); - - $this->assertAttributeEquals('State1', 'state', $originator); - - $originator->setState('State2'); - $this->assertAttributeEquals('State2', 'state', $originator); - - $snapshot = $originator->getStateAsMemento(); - $this->assertAttributeEquals('State2', 'state', $snapshot); - - $originator->setState('State3'); - $this->assertAttributeEquals('State3', 'state', $originator); - - $originator->restoreFromMemento($snapshot); - $this->assertAttributeEquals('State2', 'state', $originator); - } - - public function testSnapshotIsClone() - { - $originator = new Originator(); - $object = new \stdClass(); - - $originator->setState($object); - $snapshot = $originator->getStateAsMemento(); - $object->new_property = 1; - - $this->assertAttributeEquals($object, 'state', $originator); - $this->assertAttributeNotEquals($object, 'state', $snapshot); - - $originator->restoreFromMemento($snapshot); - $this->assertAttributeNotEquals($object, 'state', $originator); - } - - public function testCanChangeActualState() - { - $originator = new Originator(); - $first_state = new \stdClass(); - - $originator->setState($first_state); - $snapshot = $originator->getStateAsMemento(); - $second_state = $snapshot->getState(); - - // still actual - $first_state->first_property = 1; - // just history - $second_state->second_property = 2; - $this->assertAttributeEquals($first_state, 'state', $originator); - $this->assertAttributeNotEquals($second_state, 'state', $originator); - - $originator->restoreFromMemento($snapshot); - // now it lost state - $first_state->first_property = 11; - // must be actual - $second_state->second_property = 22; - $this->assertAttributeEquals($second_state, 'state', $originator); - $this->assertAttributeNotEquals($first_state, 'state', $originator); - } - - public function testStateWithDifferentObjects() - { - $originator = new Originator(); - - $first = new \stdClass(); - $first->data = 'foo'; - - $originator->setState($first); - $this->assertAttributeEquals($first, 'state', $originator); - - $first_snapshot = $originator->getStateAsMemento(); - $this->assertAttributeEquals($first, 'state', $first_snapshot); - - $second = new \stdClass(); - $second->data = 'bar'; - $originator->setState($second); - $this->assertAttributeEquals($second, 'state', $originator); - - $originator->restoreFromMemento($first_snapshot); - $this->assertAttributeEquals($first, 'state', $originator); - } - - public function testCaretaker() - { - $caretaker = new Caretaker(); - $memento1 = new Memento('foo'); - $memento2 = new Memento('bar'); - $caretaker->saveToHistory($memento1); - $caretaker->saveToHistory($memento2); - $this->assertAttributeEquals(array($memento1, $memento2), 'history', $caretaker); - $this->assertEquals($memento1, $caretaker->getFromHistory(0)); - $this->assertEquals($memento2, $caretaker->getFromHistory(1)); - } - - public function testCaretakerCustomLogic() - { - $caretaker = new Caretaker(); - $result = $caretaker->runCustomLogic(); - $this->assertEquals('State3', $result); + $this->assertEquals(State::STATE_OPENED, (string) $ticket->getState()); + $this->assertNotSame($openedState, $ticket->getState()); } } diff --git a/Behavioral/Memento/Ticket.php b/Behavioral/Memento/Ticket.php new file mode 100644 index 0000000..13f75e7 --- /dev/null +++ b/Behavioral/Memento/Ticket.php @@ -0,0 +1,49 @@ +currentState = new State(State::STATE_CREATED); + } + + public function open() + { + $this->currentState = new State(State::STATE_OPENED); + } + + public function assign() + { + $this->currentState = new State(State::STATE_ASSIGNED); + } + + public function close() + { + $this->currentState = new State(State::STATE_CLOSED); + } + + public function saveToMemento(): Memento + { + return new Memento(clone $this->currentState); + } + + public function restoreFromMemento(Memento $memento) + { + $this->currentState = $memento->getState(); + } + + public function getState(): State + { + return $this->currentState; + } +} diff --git a/Behavioral/Memento/uml/Memento.uml b/Behavioral/Memento/uml/Memento.uml new file mode 100644 index 0000000..194187a --- /dev/null +++ b/Behavioral/Memento/uml/Memento.uml @@ -0,0 +1,21 @@ + + + PHP + \DesignPatterns\Behavioral\Memento\Memento + + \DesignPatterns\Behavioral\Memento\State + \DesignPatterns\Behavioral\Memento\Memento + \DesignPatterns\Behavioral\Memento\Ticket + + + + + + + Fields + Constants + Methods + + private + + diff --git a/Behavioral/Memento/uml/Momento.uml b/Behavioral/Memento/uml/Momento.uml deleted file mode 100644 index c72667e..0000000 --- a/Behavioral/Memento/uml/Momento.uml +++ /dev/null @@ -1,22 +0,0 @@ - - - PHP - \DesignPatterns\Behavioral\Memento\Caretaker - - \DesignPatterns\Behavioral\Memento\Caretaker - \DesignPatterns\Behavioral\Memento\Originator - \DesignPatterns\Behavioral\Memento\Memento - - - - - - - Fields - Constants - Constructors - Methods - - private - - diff --git a/Behavioral/Memento/uml/uml.png b/Behavioral/Memento/uml/uml.png index 0fde074e8a8f2f74c617bbc4a0e7323c2c346fb7..417b29343cecee29103ae3698790b8e7273ec2bc 100644 GIT binary patch literal 63348 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

|3Ve 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 -@8;i0C@=r>p~-V(@tewk}bgZY{Q%_e4Y+O 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

_fRntTQwG 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - state - - - - - - - - - - - - setState(state) - - - - - - - - - saveToMemento() - - - - - - - - - restoreFromMemento(memento) - - - - - - - - - - - - - Originator - - - Originator - - - - - - - - - - - - - - - - - - run() - - - - - - - - - - - - - Caretaker - - - Caretaker - - - - - - - - - - - - - - - - - - - state - - - - - - - - - - - - __construct(stateToSave) - - - - - - - - - - - - getState() - - - - - - - - - - - - - Memento - - - Memento - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + validStates + + + + + + + + + + + + + + + + state + + + + + + + + + + + + + + + + + + + STATE_CREATED + + + + + + + + + + + + + + + + STATE_OPENED + + + + + + + + + + + + + + + + STATE_ASSIGNED + + + + + + + + + + + + + + + + STATE_CLOSED + + + + + + + + + + + + + + + + ensureIsValidState(state) + + + + + + + + + + + + + __toString() + + + + + + + + + + + + + State + + + State + + + + + + + + + + + + + + + + + + + + + + + + + validStates + + + + + + + + + + + + + + + + state + + + + + + + + + + + + + + + + + + + STATE_CREATED + + + + + + + + + + + + + + + + STATE_OPENED + + + + + + + + + + + + + + + + STATE_ASSIGNED + + + + + + + + + + + + + + + + STATE_CLOSED + + + + + + + + + + + + + + + + + + + + + + ensureIsValidState(state) + + + + + + + + + + + + + + + + __toString() + + + + + + + + + + + + + State + + + State + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + state + + + + + + + + + + + + + + + + getState() + + + + + + + + + + + + + Memento + + + Memento + + + + + + + + + + + + + + + + + + + + + + state + + + + + + + + + + + + + + + + + + + getState() + + + + + + + + + + + + + Memento + + + Memento + + + + + + + + + + + + + + + + + + + + + + + + + currentState + + + + + + + + + + + + + + + + open() + + + + + + + + + + + + + assign() + + + + + + + + + + + + + close() + + + + + + + + + + + + + saveToMemento() + + + + + + + + + + + + + restoreFromMemento(memento) + + + + + + + + + + + + + getState() + + + + + + + + + + + + + Ticket + + + Ticket + + + + + + + + + + + + + + + + + + + + + + currentState + + + + + + + + + + + + + + + + + + + open() + + + + + + + + + + + + + + + + assign() + + + + + + + + + + + + + + + + close() + + + + + + + + + + + + + + + + saveToMemento() + + + + + + + + + + + + + + + + restoreFromMemento(memento) + + + + + + + + + + + + + + + + getState() + + + + + + + + + + + + + Ticket + + + Ticket + + + From b707bf064e6693ab7aacb212901aa3631dc3d6a4 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 10:43:27 +0200 Subject: [PATCH 047/148] PHP7 NullObject --- Behavioral/NullObject/LoggerInterface.php | 11 ++--------- Behavioral/NullObject/NullLogger.php | 12 +----------- Behavioral/NullObject/PrintLogger.php | 8 +------- Behavioral/NullObject/Service.php | 16 +++++----------- Behavioral/NullObject/Tests/LoggerTest.php | 7 +------ 5 files changed, 10 insertions(+), 44 deletions(-) diff --git a/Behavioral/NullObject/LoggerInterface.php b/Behavioral/NullObject/LoggerInterface.php index 99a28c7..7c1ff7d 100644 --- a/Behavioral/NullObject/LoggerInterface.php +++ b/Behavioral/NullObject/LoggerInterface.php @@ -3,16 +3,9 @@ namespace DesignPatterns\Behavioral\NullObject; /** - * LoggerInterface is a contract for logging something. - * - * Key feature: NullLogger MUST inherit from this interface like any other Loggers + * Key feature: NullLogger must inherit from this interface like any other loggers */ interface LoggerInterface { - /** - * @param string $str - * - * @return mixed - */ - public function log($str); + public function log(string $str); } diff --git a/Behavioral/NullObject/NullLogger.php b/Behavioral/NullObject/NullLogger.php index a4bf469..afddbd6 100644 --- a/Behavioral/NullObject/NullLogger.php +++ b/Behavioral/NullObject/NullLogger.php @@ -2,19 +2,9 @@ namespace DesignPatterns\Behavioral\NullObject; -/** - * Performance concerns : ok there is a call for nothing but we spare an "if is_null" - * I didn't run a benchmark but I think it's equivalent. - * - * Key feature : of course this logger MUST implement the same interface (or abstract) - * like the other loggers. - */ class NullLogger implements LoggerInterface { - /** - * {@inheritdoc} - */ - public function log($str) + public function log(string $str) { // do nothing } diff --git a/Behavioral/NullObject/PrintLogger.php b/Behavioral/NullObject/PrintLogger.php index 371c1ab..6c1d4ba 100644 --- a/Behavioral/NullObject/PrintLogger.php +++ b/Behavioral/NullObject/PrintLogger.php @@ -2,15 +2,9 @@ namespace DesignPatterns\Behavioral\NullObject; -/** - * PrintLogger is a logger that prints the log entry to standard output. - */ class PrintLogger implements LoggerInterface { - /** - * @param string $str - */ - public function log($str) + public function log(string $str) { echo $str; } diff --git a/Behavioral/NullObject/Service.php b/Behavioral/NullObject/Service.php index 56a3847..81baf8f 100644 --- a/Behavioral/NullObject/Service.php +++ b/Behavioral/NullObject/Service.php @@ -2,24 +2,19 @@ namespace DesignPatterns\Behavioral\NullObject; -/** - * Service is dummy service that uses a logger. - */ class Service { /** * @var LoggerInterface */ - protected $logger; + private $logger; /** - * we inject the logger in ctor and it is mandatory. - * - * @param LoggerInterface $log + * @param LoggerInterface $logger */ - public function __construct(LoggerInterface $log) + public function __construct(LoggerInterface $logger) { - $this->logger = $log; + $this->logger = $logger; } /** @@ -27,8 +22,7 @@ class Service */ public function doSomething() { - // no more check "if (!is_null($this->logger))..." with the NullObject pattern + // notice here that you don't have to check if the logger is set with eg. is_null(), instead just use it $this->logger->log('We are in '.__METHOD__); - // something to do... } } diff --git a/Behavioral/NullObject/Tests/LoggerTest.php b/Behavioral/NullObject/Tests/LoggerTest.php index 034b577..0e35aa5 100644 --- a/Behavioral/NullObject/Tests/LoggerTest.php +++ b/Behavioral/NullObject/Tests/LoggerTest.php @@ -6,17 +6,12 @@ use DesignPatterns\Behavioral\NullObject\NullLogger; use DesignPatterns\Behavioral\NullObject\PrintLogger; use DesignPatterns\Behavioral\NullObject\Service; -/** - * LoggerTest tests for different loggers. - */ class LoggerTest extends \PHPUnit_Framework_TestCase { public function testNullObject() { - // one can use a singleton for NullObjet : I don't think it's a good idea - // because the purpose behind null object is to "avoid special case". $service = new Service(new NullLogger()); - $this->expectOutputString(null); // no output + $this->expectOutputString(null); $service->doSomething(); } From 9b9eee5a4cefc1301df368b3215e2489e3c216a9 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 10:54:22 +0200 Subject: [PATCH 048/148] PHP7 Observer --- Behavioral/Observer/Tests/ObserverTest.php | 61 +- Behavioral/Observer/User.php | 57 +- Behavioral/Observer/UserObserver.php | 21 +- Behavioral/Observer/uml/Observer.uml | 53 +- Behavioral/Observer/uml/uml.png | Bin 9977 -> 45971 bytes Behavioral/Observer/uml/uml.svg | 959 ++++++++++++++------- 6 files changed, 707 insertions(+), 444 deletions(-) diff --git a/Behavioral/Observer/Tests/ObserverTest.php b/Behavioral/Observer/Tests/ObserverTest.php index 6a3f369..c263997 100644 --- a/Behavioral/Observer/Tests/ObserverTest.php +++ b/Behavioral/Observer/Tests/ObserverTest.php @@ -5,65 +5,16 @@ namespace DesignPatterns\Behavioral\Observer\Tests; use DesignPatterns\Behavioral\Observer\User; use DesignPatterns\Behavioral\Observer\UserObserver; -/** - * ObserverTest tests the Observer pattern. - */ class ObserverTest extends \PHPUnit_Framework_TestCase { - protected $observer; - - protected function setUp() + public function testChangeInUserLeadsToUserObserverBeingNotified() { - $this->observer = new UserObserver(); - } + $observer = new UserObserver(); - /** - * Tests the notification. - */ - public function testNotify() - { - $this->expectOutputString('DesignPatterns\Behavioral\Observer\User has been updated'); - $subject = new User(); + $user = new User(); + $user->attach($observer); - $subject->attach($this->observer); - $subject->property = 123; - } - - /** - * Tests the subscribing. - */ - public function testAttachDetach() - { - $subject = new User(); - $reflection = new \ReflectionProperty($subject, 'observers'); - - $reflection->setAccessible(true); - /** @var \SplObjectStorage $observers */ - $observers = $reflection->getValue($subject); - - $this->assertInstanceOf('SplObjectStorage', $observers); - $this->assertFalse($observers->contains($this->observer)); - - $subject->attach($this->observer); - $this->assertTrue($observers->contains($this->observer)); - - $subject->detach($this->observer); - $this->assertFalse($observers->contains($this->observer)); - } - - /** - * Tests the update() invocation on a mockup. - */ - public function testUpdateCalling() - { - $subject = new User(); - $observer = $this->createMock('SplObserver'); - $subject->attach($observer); - - $observer->expects($this->once()) - ->method('update') - ->with($subject); - - $subject->notify(); + $user->changeEmail('foo@bar.com'); + $this->assertCount(1, $observer->getChangedUsers()); } } diff --git a/Behavioral/Observer/User.php b/Behavioral/Observer/User.php index 0d2a817..6fd58d4 100644 --- a/Behavioral/Observer/User.php +++ b/Behavioral/Observer/User.php @@ -3,60 +3,42 @@ namespace DesignPatterns\Behavioral\Observer; /** - * Observer pattern : The observed object (the subject). - * - * The subject maintains a list of Observers and sends notifications. + * User implements the observed object (called Subject), it maintains a list of observers and sends notifications to + * them in case changes are made on the User object */ class User implements \SplSubject { /** - * user data. - * - * @var array + * @var string */ - protected $data = array(); + private $email; /** - * observers. - * * @var \SplObjectStorage */ - protected $observers; + private $observers; public function __construct() { $this->observers = new \SplObjectStorage(); } - /** - * attach a new observer. - * - * @param \SplObserver $observer - * - * @return void - */ public function attach(\SplObserver $observer) { $this->observers->attach($observer); } - /** - * detach an observer. - * - * @param \SplObserver $observer - * - * @return void - */ public function detach(\SplObserver $observer) { $this->observers->detach($observer); } - /** - * notify observers. - * - * @return void - */ + public function changeEmail(string $email) + { + $this->email = $email; + $this->notify(); + } + public function notify() { /** @var \SplObserver $observer */ @@ -64,21 +46,4 @@ class User implements \SplSubject $observer->update($this); } } - - /** - * Ideally one would better write setter/getter for all valid attributes and only call notify() - * on attributes that matter when changed. - * - * @param string $name - * @param mixed $value - * - * @return void - */ - public function __set($name, $value) - { - $this->data[$name] = $value; - - // notify the observers, that user has been updated - $this->notify(); - } } diff --git a/Behavioral/Observer/UserObserver.php b/Behavioral/Observer/UserObserver.php index f2673ba..243e740 100644 --- a/Behavioral/Observer/UserObserver.php +++ b/Behavioral/Observer/UserObserver.php @@ -2,19 +2,28 @@ namespace DesignPatterns\Behavioral\Observer; -/** - * class UserObserver. - */ class UserObserver implements \SplObserver { /** - * This is the only method to implement as an observer. - * It is called by the Subject (usually by SplSubject::notify() ). + * @var User[] + */ + private $changedUsers = []; + + /** + * It is called by the Subject, usually by SplSubject::notify() * * @param \SplSubject $subject */ public function update(\SplSubject $subject) { - echo get_class($subject).' has been updated'; + $this->changedUsers[] = clone $subject; + } + + /** + * @return User[] + */ + public function getChangedUsers(): array + { + return $this->changedUsers; } } diff --git a/Behavioral/Observer/uml/Observer.uml b/Behavioral/Observer/uml/Observer.uml index 0e5ddef..b74d770 100644 --- a/Behavioral/Observer/uml/Observer.uml +++ b/Behavioral/Observer/uml/Observer.uml @@ -1,27 +1,26 @@ - - - PHP - \DesignPatterns\Behavioral\Observer\User - - \DesignPatterns\Behavioral\Observer\UserObserver - \DesignPatterns\Behavioral\Observer\User - \SplSubject - - - - - - - - - - - - Fields - Constants - Constructors - Methods - - private - - + + + PHP + \DesignPatterns\Behavioral\Observer\UserObserver + + \DesignPatterns\Behavioral\Observer\UserObserver + \SplObserver + \DesignPatterns\Behavioral\Observer\User + + + + + + + + + + + + Fields + Constants + Methods + + private + + diff --git a/Behavioral/Observer/uml/uml.png b/Behavioral/Observer/uml/uml.png index 0300bd4a9d4f4cb2626518ca52d45a1fa7ff3746..3eff4646fbc8ebbbbbf96abcb849ae30ed1a5cf1 100644 GIT binary patch literal 45971 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 literal 9977 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - data - - - - - - - - - - observers - - - - - - - - - - - - attach(observer) - - - - - - - - - detach(observer) - - - - - - - - - notify() - - - - - - - - - __set(name, value) - - - - - - - - - - - - - User - - - User - - - - - - - - - - - - - - - - - - update(subject) - - - - - - - - - - - - - UserObserver - - - UserObserver - - - - - - - - - - - - - - - - - - attach(observer) - - - - - - - - - detach(observer) - - - - - - - - - notify() - - - - - - - - - - - - - SplSubject - - - SplSubject - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + changedUsers + + + + + + + + + + + + + + + + update(subject) + + + + + + + + + + + + + getChangedUsers() + + + + + + + + + + + + + UserObserver + + + UserObserver + + + + + + + + + + + + + + + + + + + + + + changedUsers + + + + + + + + + + + + + + + + + + + update(subject) + + + + + + + + + + + + + + + + getChangedUsers() + + + + + + + + + + + + + UserObserver + + + UserObserver + + + + + + + + + + + + + + + + + + + + + + update(subject) + + + + + + + + + + + + + SplObserver + + + SplObserver + + + + + + + + + + + + + + + + + + + + + + update(subject) + + + + + + + + + + + + + SplObserver + + + SplObserver + + + + + + + + + + + + + + + + + + + + + + + + + email + + + + + + + + + + + + + + + + observers + + + + + + + + + + + + + + + + attach(observer) + + + + + + + + + + + + + detach(observer) + + + + + + + + + + + + + changeEmail(email) + + + + + + + + + + + + + notify() + + + + + + + + + + + + + User + + + User + + + + + + + + + + + + + + + + + + + + + + email + + + + + + + + + + + + + + + + observers + + + + + + + + + + + + + + + + + + + attach(observer) + + + + + + + + + + + + + + + + detach(observer) + + + + + + + + + + + + + + + + changeEmail(email) + + + + + + + + + + + + + + + + notify() + + + + + + + + + + + + + User + + + User + + + + + + + + + From 36f3df8fbb5da9a7ff539bd95940a45c7e2e315d Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 11:02:03 +0200 Subject: [PATCH 049/148] PHP7 Strategy --- Behavioral/Strategy/ComparatorInterface.php | 4 +- Behavioral/Strategy/DateComparator.php | 13 +++-- Behavioral/Strategy/IdComparator.php | 13 +++-- Behavioral/Strategy/ObjectCollection.php | 12 ++--- Behavioral/Strategy/Tests/StrategyTest.php | 58 +++++++++++---------- 5 files changed, 47 insertions(+), 53 deletions(-) diff --git a/Behavioral/Strategy/ComparatorInterface.php b/Behavioral/Strategy/ComparatorInterface.php index 8e3c893..4c5dcb2 100644 --- a/Behavioral/Strategy/ComparatorInterface.php +++ b/Behavioral/Strategy/ComparatorInterface.php @@ -8,7 +8,7 @@ interface ComparatorInterface * @param mixed $a * @param mixed $b * - * @return bool + * @return int */ - public function compare($a, $b); + public function compare($a, $b): int; } diff --git a/Behavioral/Strategy/DateComparator.php b/Behavioral/Strategy/DateComparator.php index 37fc3ba..3f59667 100644 --- a/Behavioral/Strategy/DateComparator.php +++ b/Behavioral/Strategy/DateComparator.php @@ -5,17 +5,16 @@ namespace DesignPatterns\Behavioral\Strategy; class DateComparator implements ComparatorInterface { /** - * {@inheritdoc} + * @param mixed $a + * @param mixed $b + * + * @return int */ - public function compare($a, $b) + public function compare($a, $b): int { $aDate = new \DateTime($a['date']); $bDate = new \DateTime($b['date']); - if ($aDate == $bDate) { - return 0; - } - - return $aDate < $bDate ? -1 : 1; + return $aDate <=> $bDate; } } diff --git a/Behavioral/Strategy/IdComparator.php b/Behavioral/Strategy/IdComparator.php index 1f882a1..80c43cc 100644 --- a/Behavioral/Strategy/IdComparator.php +++ b/Behavioral/Strategy/IdComparator.php @@ -5,14 +5,13 @@ namespace DesignPatterns\Behavioral\Strategy; class IdComparator implements ComparatorInterface { /** - * {@inheritdoc} + * @param mixed $a + * @param mixed $b + * + * @return int */ - public function compare($a, $b) + public function compare($a, $b): int { - if ($a['id'] == $b['id']) { - return 0; - } else { - return $a['id'] < $b['id'] ? -1 : 1; - } + return $a['id'] <=> $b['id']; } } diff --git a/Behavioral/Strategy/ObjectCollection.php b/Behavioral/Strategy/ObjectCollection.php index ed20969..ca8165b 100644 --- a/Behavioral/Strategy/ObjectCollection.php +++ b/Behavioral/Strategy/ObjectCollection.php @@ -17,30 +17,24 @@ class ObjectCollection /** * @param array $elements */ - public function __construct(array $elements = array()) + public function __construct(array $elements = []) { $this->elements = $elements; } - /** - * @return array - */ - public function sort() + public function sort(): array { if (!$this->comparator) { throw new \LogicException('Comparator is not set'); } - $callback = array($this->comparator, 'compare'); - uasort($this->elements, $callback); + uasort($this->elements, [$this->comparator, 'compare']); return $this->elements; } /** * @param ComparatorInterface $comparator - * - * @return void */ public function setComparator(ComparatorInterface $comparator) { diff --git a/Behavioral/Strategy/Tests/StrategyTest.php b/Behavioral/Strategy/Tests/StrategyTest.php index 1911ba4..033a4a9 100644 --- a/Behavioral/Strategy/Tests/StrategyTest.php +++ b/Behavioral/Strategy/Tests/StrategyTest.php @@ -5,43 +5,42 @@ namespace DesignPatterns\Behavioral\Strategy\Tests; use DesignPatterns\Behavioral\Strategy\DateComparator; use DesignPatterns\Behavioral\Strategy\IdComparator; use DesignPatterns\Behavioral\Strategy\ObjectCollection; -use DesignPatterns\Behavioral\Strategy\Strategy; -/** - * Tests for Strategy pattern. - */ class StrategyTest extends \PHPUnit_Framework_TestCase { - public function getIdCollection() + public function provideIntegers() { - return array( - array( - array(array('id' => 2), array('id' => 1), array('id' => 3)), - array('id' => 1), - ), - array( - array(array('id' => 3), array('id' => 2), array('id' => 1)), - array('id' => 1), - ), - ); + return [ + [ + [['id' => 2], ['id' => 1], ['id' => 3]], + ['id' => 1], + ], + [ + [['id' => 3], ['id' => 2], ['id' => 1]], + ['id' => 1], + ], + ]; } - public function getDateCollection() + public function providateDates() { - return array( - array( - array(array('date' => '2014-03-03'), array('date' => '2015-03-02'), array('date' => '2013-03-01')), - array('date' => '2013-03-01'), - ), - array( - array(array('date' => '2014-02-03'), array('date' => '2013-02-01'), array('date' => '2015-02-02')), - array('date' => '2013-02-01'), - ), - ); + return [ + [ + [['date' => '2014-03-03'], ['date' => '2015-03-02'], ['date' => '2013-03-01']], + ['date' => '2013-03-01'], + ], + [ + [['date' => '2014-02-03'], ['date' => '2013-02-01'], ['date' => '2015-02-02']], + ['date' => '2013-02-01'], + ], + ]; } /** - * @dataProvider getIdCollection + * @dataProvider provideIntegers + * + * @param array $collection + * @param array $expected */ public function testIdComparator($collection, $expected) { @@ -54,7 +53,10 @@ class StrategyTest extends \PHPUnit_Framework_TestCase } /** - * @dataProvider getDateCollection + * @dataProvider providateDates + * + * @param array $collection + * @param array $expected */ public function testDateComparator($collection, $expected) { From 19fff0aed9a3fe0f2b29ef699550459366b07bcb Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 11:13:47 +0200 Subject: [PATCH 050/148] PHP7 TemplateMethod --- Behavioral/TemplateMethod/BeachJourney.php | 10 +- Behavioral/TemplateMethod/CityJourney.php | 15 +- Behavioral/TemplateMethod/Journey.php | 58 +- .../TemplateMethod/Tests/JourneyTest.php | 49 +- .../TemplateMethod/uml/TemplateMethod.uml | 70 +- Behavioral/TemplateMethod/uml/uml.png | Bin 8688 -> 46609 bytes Behavioral/TemplateMethod/uml/uml.svg | 892 +++++++++++++----- 7 files changed, 734 insertions(+), 360 deletions(-) diff --git a/Behavioral/TemplateMethod/BeachJourney.php b/Behavioral/TemplateMethod/BeachJourney.php index d19845c..5007054 100644 --- a/Behavioral/TemplateMethod/BeachJourney.php +++ b/Behavioral/TemplateMethod/BeachJourney.php @@ -2,16 +2,10 @@ namespace DesignPatterns\Behavioral\TemplateMethod; -/** - * BeachJourney is vacation at the beach. - */ class BeachJourney extends Journey { - /** - * prints what to do to enjoy your vacation. - */ - protected function enjoyVacation() + protected function enjoyVacation(): string { - echo "Swimming and sun-bathing\n"; + return "Swimming and sun-bathing"; } } diff --git a/Behavioral/TemplateMethod/CityJourney.php b/Behavioral/TemplateMethod/CityJourney.php index 3f36b61..f1f9335 100644 --- a/Behavioral/TemplateMethod/CityJourney.php +++ b/Behavioral/TemplateMethod/CityJourney.php @@ -2,16 +2,15 @@ namespace DesignPatterns\Behavioral\TemplateMethod; -/** - * CityJourney is a journey in a city. - */ class CityJourney extends Journey { - /** - * prints what to do in your journey to enjoy vacation. - */ - protected function enjoyVacation() + protected function enjoyVacation(): string { - echo "Eat, drink, take photos and sleep\n"; + return "Eat, drink, take photos and sleep"; + } + + protected function buyGift(): string + { + return "Buy a gift"; } } diff --git a/Behavioral/TemplateMethod/Journey.php b/Behavioral/TemplateMethod/Journey.php index c7a6809..0a1407c 100644 --- a/Behavioral/TemplateMethod/Journey.php +++ b/Behavioral/TemplateMethod/Journey.php @@ -4,6 +4,11 @@ namespace DesignPatterns\Behavioral\TemplateMethod; abstract class Journey { + /** + * @var string[] + */ + private $thingsToDo = []; + /** * This is the public service provided by this class and its subclasses. * Notice it is final to "freeze" the global behavior of algorithm. @@ -12,46 +17,49 @@ abstract class Journey */ final public function takeATrip() { - $this->buyAFlight(); - $this->takePlane(); - $this->enjoyVacation(); - $this->buyGift(); - $this->takePlane(); + $this->thingsToDo[] = $this->buyAFlight(); + $this->thingsToDo[] = $this->takePlane(); + $this->thingsToDo[] = $this->enjoyVacation(); + $buyGift = $this->buyGift(); + + if ($buyGift !== null) { + $this->thingsToDo[] = $buyGift; + } + + $this->thingsToDo[] = $this->takePlane(); } /** * This method must be implemented, this is the key-feature of this pattern. */ - abstract protected function enjoyVacation(); + abstract protected function enjoyVacation(): string; /** * This method is also part of the algorithm but it is optional. - * This is an "adapter" (do not confuse with the Adapter pattern, not related) - * You can override it only if you need to. + * You can override it only if you need to + * + * @return null|string */ protected function buyGift() { + return null; + } + + private function buyAFlight(): string + { + return 'Buy a flight ticket'; + } + + private function takePlane(): string + { + return 'Taking the plane'; } /** - * This method will be unknown by subclasses (better). + * @return string[] */ - private function buyAFlight() + public function getThingsToDo(): array { - echo "Buying a flight\n"; + return $this->thingsToDo; } - - /** - * Subclasses will get access to this method but cannot override it and - * compromise this algorithm (warning : cause of cyclic dependencies). - */ - final protected function takePlane() - { - echo "Taking the plane\n"; - } - - // A note regarding the keyword "final" : don't use it when you start coding : - // add it after you narrow and know exactly what change and what remain unchanged - // in this algorithm. - // [abstract] x [3 access] x [final] = 12 combinations, it can be hard ! } diff --git a/Behavioral/TemplateMethod/Tests/JourneyTest.php b/Behavioral/TemplateMethod/Tests/JourneyTest.php index 82acef3..26c1763 100644 --- a/Behavioral/TemplateMethod/Tests/JourneyTest.php +++ b/Behavioral/TemplateMethod/Tests/JourneyTest.php @@ -4,40 +4,33 @@ namespace DesignPatterns\Behavioral\TemplateMethod\Tests; use DesignPatterns\Behavioral\TemplateMethod; -/** - * JourneyTest tests all journeys. - */ class JourneyTest extends \PHPUnit_Framework_TestCase { - public function testBeach() + public function testCanGetOnVacationOnTheBeach() { - $journey = new TemplateMethod\BeachJourney(); - $this->expectOutputRegex('#sun-bathing#'); - $journey->takeATrip(); + $beachJourney = new TemplateMethod\BeachJourney(); + $beachJourney->takeATrip(); + + $this->assertEquals( + ['Buy a flight ticket', 'Taking the plane', 'Swimming and sun-bathing', 'Taking the plane'], + $beachJourney->getThingsToDo() + ); } - public function testCity() + public function testCanGetOnAJourneyToACity() { - $journey = new TemplateMethod\CityJourney(); - $this->expectOutputRegex('#drink#'); - $journey->takeATrip(); - } + $beachJourney = new TemplateMethod\CityJourney(); + $beachJourney->takeATrip(); - /** - * How to test an abstract template method with PHPUnit. - */ - public function testLasVegas() - { - $journey = $this->getMockForAbstractClass('DesignPatterns\Behavioral\TemplateMethod\Journey'); - $journey->expects($this->once()) - ->method('enjoyVacation') - ->will($this->returnCallback(array($this, 'mockUpVacation'))); - $this->expectOutputRegex('#Las Vegas#'); - $journey->takeATrip(); - } - - public function mockUpVacation() - { - echo "Fear and loathing in Las Vegas\n"; + $this->assertEquals( + [ + 'Buy a flight ticket', + 'Taking the plane', + 'Eat, drink, take photos and sleep', + 'Buy a gift', + 'Taking the plane' + ], + $beachJourney->getThingsToDo() + ); } } diff --git a/Behavioral/TemplateMethod/uml/TemplateMethod.uml b/Behavioral/TemplateMethod/uml/TemplateMethod.uml index 063b022..29d6c04 100644 --- a/Behavioral/TemplateMethod/uml/TemplateMethod.uml +++ b/Behavioral/TemplateMethod/uml/TemplateMethod.uml @@ -1,35 +1,35 @@ - - - PHP - \DesignPatterns\Behavioral\TemplateMethod\BeachJourney - - \DesignPatterns\Behavioral\TemplateMethod\CityJourney - \DesignPatterns\Behavioral\TemplateMethod\Journey - \DesignPatterns\Behavioral\TemplateMethod\BeachJourney - - - - - - - - - - - - - - - - - - - - Fields - Constants - Constructors - Methods - - private - - + + + PHP + \DesignPatterns\Behavioral\TemplateMethod\BeachJourney + + \DesignPatterns\Behavioral\TemplateMethod\BeachJourney + \DesignPatterns\Behavioral\TemplateMethod\Journey + \DesignPatterns\Behavioral\TemplateMethod\CityJourney + + + + + + + + + + + + + + + + + + + + Fields + Constants + Constructors + Methods + + private + + diff --git a/Behavioral/TemplateMethod/uml/uml.png b/Behavioral/TemplateMethod/uml/uml.png index c557e8fcdb831339cfab288323611835f0cac518..d8e9f6980600cc71d0c5704f2b61b1ced742b7b1 100644 GIT binary patch literal 46609 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